也谈零基础学编程,需要学什么
- 零基础人群
- 语法
- 1、注释
- 2、变量
- 2.1 变量命名
- 2.2 数据类型
- 2.3 类型强度
- 3、 运算符
- 4、流程控制与代码块
- 5、函数和方法
- 6、类
- 算法
- 学会使用第三方库
- 小结
零基础人群
现在开发语言各种各样,越来越多,尤其是 python ,被广大人群称为最容易上手的开发语言,于是不少小伙伴在完全没有相关知识的情况下,直接开始自学起了 python ,但是,学的是步履蹒跚,举步维艰的样子。
这几天,在新星计划,Dream 导师的 python 基础赛道里,有个完完全全的零基础小伙伴开始自学,还特意给自己画了个脑图。。。老顾当时都惊呆了啊。
但是观察了一段时间,发现小伙伴还是不得其法,学习中充满了迷茫。
那么,老顾就以资深咸鱼的资格,说说老顾对零基础开始学习的人,应该学什么做一些议论。
CSDN 文盲老顾的博客,https://blog.csdn.net/superwfei
语法
学任意一门语言,都是从语法开始学习的,在学习语法的过程中,学习一些基础的单词(关键字),用来实现对应的语法。老顾在《python 基础系列篇:一、基本语法与基础数据类型》一文中,大略的说了一些语法问题,但是不够完整。这里老顾把老顾自己知道的语法都列举一下,让小伙伴们知道,后续会用到什么样的内容。
1、注释
书写在代码内,但是在运行时不会被执行的内容,通常具有特殊定义方式
例如,在 python 中,用 # 号作为注释
在 asp/vb 中,以单引号 ’ 表示注释,也可以写作 rem
在 c 系语言中,一般用 // 表示注释,或者 /* */ 来表示范围注释
当然,也会有其他各种各样的注释方式,注释的内容,一般是为了增强可读性,描述当前,或者后续的内容是做什么的
2、变量
用以记录数据的字符,其记录的内容会因计算或赋值发生改变。
2.1 变量命名
多数语言有有一个变量命名规则:数字字母下划线构成,且不得以数字开头。
当然,现在命名规范没那么严格了,除了不能用各种运算符,以及继续不得以数字开头外,其他规范放宽了。
比如,在 python 里,计数 = 0 ,这里计数就是一个变量了,这个命名是合法的
2.2 数据类型
计算机编程,就是对各种数据进行运算的一个过程,那么对于数据,就一定要表示出其类型来,否则,别说计算机了,就连人类自己,也不一定能猜出,某个数据到底是啥玩意,比如这样一串字符:202305,那他到底是表示的年月呢,还是表示的一个数字呢?又或者是一个邮政编码?更或者,是一个行政区划编码?
对于数据类型,在计算机中有严格的描述方式,不同的数据类型,可以使用的运算符也不同,需要自己了解后才能继续。这里列举一些常见的。
数值型
大多数语言中,数值型至少分做两个类型,整数型和浮点型,浮点型的意思就是有小数。其次,有些语言会划分的更多,比如短整型,长整型,无符号整型,单精度浮点,双精度浮点等等。
字符型
所有计算机编程,输入和输出部分,必定是字符或者字符串型,开发语言会自动将其转为计算机可处理的方式。这里字符型和字符串型又有不同,字符型一定是单字符,而字符串,则是有多个字符组成的一个字符序列。
对于不同的语言,有不同的实现方式。
比如 python 中没有严格区分字符型和字符串型,都是 str,可以用单引号定义,双引号定义,甚至三引号定义字符串。
而 c# 中,单引号定义字符型,双引号定义字符串型。
而对于字符串,还有各种不同的修饰,原因是有些不可见的符号,我们需要通过转义来进行定义,比如换行,比如回车,\r \n 之类的符号,于是产生了一个问题,比如 \ 到底怎么定义,于是约定 \ 也需要转义,变成 \\。
而有些时候,我们不希望其转义,那么就需要加上非转义修饰,比如 c# 中 @“\n”,python 中 r’\n’ 之类的,看各自语言如何定义字符串修饰。
布尔型
也就是逻辑型,只有两个值:真/假,通常写作 true/false,一些弱类型的语言环境中,可以用 0、undefine、null、None、0长度字符串等方式来表示假,其他数据表示真,需要注意大小写,python中,写作 True/False。
日期型
一个比较特殊的数值数据,由于计算机发展也没有太久的年头,所以一般规定,以 1900年1月1日零时零分零秒作为起始时间,用一个整数来表示与这个时间的差值,也就是所谓的时间戳,将这个时间戳转成一个对象,包含年份,月份日期等数据的对象,就是日期型了。当然,不是所有的日期都是1900开始的,也有部分语言是从1970年计算的,咱也不知道为什么。
数组型
将多个数据放在一起,可以由索引/下标来进行次第访问的数据,称为数组,不可通过索引/下标访问,且其中数据无重复的,仅仅能通过枚举/迭代访问其内容的,称为集合。在不同的语言中,对数组都有各自的扩展,比如 python 就有list、tuple等,c# 有 icollection 接口实现的可变长数组/列表。
词典型
也是在不同语言,各有实现的方式,词典型与数组型的区别就在于,不再使用索引/下标来访问其内数据,而是通过键名来访问数据,通常类似的有dict、Dictionary、Hashtable、Map 之类的各种实现。
以及其他各种语言自身实现的各种奇奇怪怪的数据类型。
2.3 类型强度
在不同的语言中,对于数据类型,有着不同的验证机制,一般分作强类型,弱类型,无类型三种。
强类型
变量需要声明,在声明时给定数据类型,后续运算严格按照数据类型进行。
弱类型
变量需要声明,但在后续使用中,可以发生类型变化。
无类型
嗯,以数据类型为准,变量自身无类型。比如 python 这样的。
3、 运算符
在了解了类型后,对于不同的类型有不同的运算符,这个没有捷径,只能死记硬背了。
a = 1 赋值运算,将数值1存放到变量 a 中
a ++ 自加运算,c 系语言一般都支持,相当于 a = a + 1,这里需要注意 ++a 和 a++ 的区别,一个是先运算后使用,一个是先试用后运算
a += 2 自加运算,大多数语言都支持,相当于 a = a + 2
a == 1 比较运算
a === 1 严格比较运算,除了值之外,还要比较类型
后续不再列举,自行了解即可。基本上每个语言的教程里,都有详细的说明,这些需要完整的记住。
4、流程控制与代码块
流程控制,顾名思义,那就是控制代码运行顺序的一种指令,比如常见的循环 while、for、until、loop 之类的,比如常见的分支 if else、switch case等。以及不太推荐使用的 goto 之类的。
在理解流程控制之前,我们要明白,计算机的程序,是一行一行次第运行的,而流程控制,则是为了改变这种情况,可以将某些部分多运行几次,或者不符合预期的不运行这个样子。
// javascript
// 在控制台输出 0-9 的 10 个数字
for (var i = 0;i < 10;i++) console.log(i)
对于缺失花括号的地方,如果本行后有内容,则本行后所有内容默认为一个代码块,否则,以下一行为默认代码块(仅仅一行哦,和缩进没关系)。
在绝大多数编程语言中,我们使用花括号 {} 来表示一个代码块,代码块内的变量,其生存周期仅在该块结束前有效,在 python 中,则用缩进来表示代码块。
Hmmm,参考老顾以前的文章即可。
5、函数和方法
对于大量的可复用的代码,通常,我们会将其单独定义为一个方法或者一个函数,避免每次用到相同运算的地方都重新写一遍或复制出来一份,除了代码臃肿之外,最大的缺陷是,当算法进行调整的时候,这种不可复用的代码维护起来非常困难,因为在之后,你自己都不一定记得到底复制了几个地方。
为了减少维护难度,所以,代码的复用性是一个代码是否优秀的评判标准之一。
对于函数和方法,需要理解形参和实参的概念,也可以参考其他人的文章,或老顾之前的文章。
6、类
刚才说到了函数和方法,通常,对于某一类相关的函数、方法,我们会封装到一个大类中,然后引用该类,并用点符号,来引用类中所定义的各种方法或函数。
比如 python
import re
x = re.findall(r'\d+','123 456 789')
这段代码就表示,引入 re 包,使用 re 包中,findall 函数
基本上,除了 javascript 外,其他语言都是仅仅能调用预定义内容,而 javascript 则可以用点语法调用 object 中所定义的键名,很是逆天。
算法
在了解并牢记了以上的内容后,需要从算法开始学起,《算法,离你并不遥远》一文中,老顾也提到了,不必一定要买本算法书去啃,学会拆分问题,分析问题,解决问题,才是算法的根本目的。
比如最简单的排序方法,就有各种各样的算法,可以去尝试理解其思路,其内在逻辑,变量数据是怎么变动的,运算流程是怎么控制的,只有理解了这些,你才会在学习的过程中,培养出编程的思路来。
如果仅仅是抄代码并运行成功,其实并没有多大用处。除非封装好的包,我们只需要调用其方法,其他所有需要我们进行控制的代码,我们都需要明确的知道,我们需要怎么一步一步的实现其运算。
以最简单的例子来说明,我们需要得出一个从1 到 100 的数字之和。
用数学方法来做,很简单,等差数列公式啊。。。。嗯,当我没说。
老顾现在不会等差数列了。怎么办?
定义一个变量,用来保存求和结果
让这个变量从1开始加,一直加到100
最后输出这个求和结果
第一个拆分问题结果出来了,现在是继续拆分问题,怎么让变量从1加到100
定义一个循环,让其循环100次
每次在循环中,使用来保存求和结果的变量,加上一个数字
问题又来了,怎么可以让这个变量每次加的数字,是一个递增的自然数呢?
在循环外定义一个变量,每次循环,该变量加1,
那么,最后的程序逻辑也就出来了。以 javascript 为例
sum = 0
for (var i = 1; i <= 100; i+++ ){
sum += i;
}
console.log(sum)
又或者 python
s,i = 0,0
while i < 100:
i += 1
s += i
print(s)
具体到程序中,循环条件怎么设置, i+= 和 s+= 谁先谁后的问题,就需要彻底了解清楚其变量变化过程,才会有概念了。
而最重要的一环,就是需要对每一个变量,每一次运算,有个预估,不管是具体值也好,范围也好,都有一个预期,并对类型有这明确的概念。
总之呢,编程,就是一个将人类思路或算法,转变成程序语言的逻辑代码的过程。
拆分问题,分析问题,实现问题,会一直伴随着开发的过程。
学会使用第三方库
任何一门编程语言,其自身所实现的内容都不会太多,而某些常见问题,常用需求,又没有必要完全自己重新实现一遍,所以,学会使用各种包/库,是一个进阶的过程。
最常见的,一个圆周率数字,我可以自己定义为 3.14,也可以定义为 3.14159,但是很多时候,这个精度就不够了,并且,对于不同平台或者不同人群做代码叙述的时候,可能每个人的习惯不同,定义的数字也略有区别了,所以为了统一,可以使用数学库中预定义的内容,Math.Pi,这样,就可以减少代码书写,并且也具有统一性,减少了分歧。
有比如,取整,不管是向下取整,还是向上取整,我相信绝大多数人,不会自己去实现一遍,通常都是使用预定义的类库中,调用相应的方法来完成的。
小结
基本上,学完这些内容,不能说精通一门编程语言,也可以输熟练掌握了。所有后续的编程工作,其实就是在这些基础的内容上腾挪转移的。
用各种流程控制,来实现不同的算法,对应上现实中,各种业务上不同的需求和逻辑。
那么,回过头来,零基础学编程,最主要的就是学会语法,了解数据类型,掌握流程控制三个项了,学号了这三项内容,其他内容就可以举一反三,以此类推的学习下去了。