让每一个中国人都能学会编程,我是艾氪森。

众所周知,IT 行业就业前景非常好,在这个行业,你真正需要靠能力和技术生存,一分努力一分收获。在我十几年的工作中, 我遇到很多非计算机专业甚至非理工科的同事,是编程改变了他们的事业和人生,包括我自己。
虽然不需要每个人都成为职业程序员,但各行各业将来都会用到编程,所以掌握基本的编程思想,有可能会帮助到将来找工作或工作中的晋升。
扩展阅读:用百度搜一搜,北上广深 IT 行业平均薪资是多少?
不要被编程吓倒,认为学起来太困难,太枯燥,如今会编程已经是一件很平常的事情,有的中小学生已经开始学习编程,小学生都能学会,你也能。
虽然学习编程的资源有很多,但有的内容太多不易读完,而有的内容精简但缺失重要信息,我们写这篇教程的目的是想让每个成年人能够尽快的入门编程, 少走弯路,我们力求做到如下几点:
用时少:不需要读完一整本书,只需要读完一两篇文章,就可以掌握基本的编程元素,并解决实际中的问题,或者发现自己暂时不适合学习编程,没太多成本。
起点低:只要学习完中学的英语和数学,肯定能够读懂,当然也不是那种图形化的少儿编程,你需要真正的动手写一些代码。
重实效:本教程会指导你写程序完成一个实际的任务:给一个成绩表格,找出平均分最高的学生姓名,你可以尝试下不用编程如何实现,比如说用纸笔,或者 Excel。
不过时:因为我们注重讲解重要的编程思维,基本的编程元素,这些知识几十年后也不会过时,而且所有编程语言几乎都是通用的。
扩展阅读:用百度搜一搜,比尔盖茨是几岁开始学习编程的?
编程就像像烹调,谱曲,写诗一样,是一项创造性的活动,使用基本的元素,通过一定的规则创造出丰富多彩的世界。编程语言有很多,但 Python 语言简单易学,通用性强,几乎可以做任何事情,初学者和专业程序员都在使用它。
第一次使用 Python,可以打开 Python 的官网 https://www.python.org/,点击 Launch Interactive Shell 按钮启动一个 Python 解释器,
在看到 >>> 提示符后,就可以输入一些 Python 代码了,我们先输入数字 1 回车,可以看到解释器也输出了 1 。

扩展阅读:用百度搜一搜,Python 能做什么事情?以及 Python 名字的由来。
计算机要解决现实中的问题,首先要模拟现实世界中的事物,如数字,文字,真假等,在 Python 里分别有对应数据类型来表示:
1, 3, 5, -5, -3 等;3.14, -2.44 等;True 和假值 False;'abc','我是中国人' 等。可以在解释器里输入一些数据进行测试,数字和 bool 类型直接输入即可,字符串的两边需要用单引号或双引号扩住,如下:
xxxxxxxxxx>>> 123123>>> -88-88>>> 3.143.14>>> TrueTrue>>> FalseFalse>>> 'abc''abc'>>> "我是中国人"'我是中国人'
思考:如果双引号括起来的字符串内部也有双引号时应该怎么办?
常见问题:
True 写成 true,代码运行会出错。有了能够表示世界的数据类型后,还需要能够模拟对数据的操作,首先是对数字的加减乘除运算:
xxxxxxxxxx>>> 1+23>>> 1-2-1>>> 3*39>>> 5/22.5>>> 5//22>>> 5%21
这里的语法和数学里是一样的,其中的 +,-,*,/ 叫 操作符或 运算符,这些是数学运算符,用来将两边的数字进行相应的操作。
特殊地方是 / 表示浮点除法,运算结果是 float 类型,// 是整数除法,运算结果是 int 类型, % 表示计算整数除法的余数。
常见问题:2 个字符组成的操作符,如 //,这两个字符是连在一起的,中间不能有空格,否则会出错。
扩展阅读:用百度搜索一下,Python 里如何求一个数的乘方?
数字之间除了加减乘除,还可以进行大小比较:
xxxxxxxxxx>>> 2>3False>>> 2<3True>>> 2<=2True>>> 2>=2True>>> 2==2True>>> 2!=2False
这里的 >,<,<=,>=,==,!= 叫做 比较操作符,对两边的数字进行比较,分表表示大于、小于、大于等于、小于等于、等于和不等于,
比较的结果是 bool 值 True 或 False。
注意这里是两个等号 == ,表示数学概念里的相等,如果写成了一个等号 =,就会报错,如下:
xxxxxxxxxx>>> 2=2SyntaxError: can't assign to literal
小提示:为了提高可读性,一般会在操作符的两边各打一个空格,如 1 + 2,2 >= 3,后面我们的示例代码都会遵循这个规则。
bool 值之间也可以逻辑运算,下面的的 and,or,not 叫 逻辑操作符:
a and b 当 a 和 b 都为 True 时,结果为 True,否则为 False;a or b 当 a 和 b 至少有一个为 True 时,结果为 True,否则为 False;not a 如果 a 为 False,值为 True,如果 a 为 True,值为 False。写代码进行练习:
xxxxxxxxxx>>> True and TrueTrue>>> False and TrueFalse>>> True or TrueTrue>>> False or FalseFalse>>> not TrueFalse>>> not FalseTrue
字符串最常用的操作是拼接和重复,操作符分别是 + 和 *,其中 * 右边是一个整数,表示要重复的次数。
xxxxxxxxxx>>> 'aaa' + 'bbb''aaabbb'>>> 'a' * 4'aaaa'
除了操作符能够操作数据外,Python 还自带一些函数,可以来操作数据,把它们理解成 Python 自带的一些命令就可以,输入命令名及一对圆括号,括号里传入要操作的数据,然后就可以得到处理后的数据。
xxxxxxxxxx>>> print("hello world")hello world>>> abs(-8)8>>> abs(8)8>>> round(3.2)3>>> round(3.5)4
上面的 print , abs 和 round 函数分别用来打印数据,求一个数的绝对值,以及对一个数进行四舍五入。
我们认识了这么多种数据类型,如果给出一个数据,如何知道它的类型呢?可以用内建函数 type 来完成:
xxxxxxxxxx>>> type(2)<class 'int'>>>> type(2.3)<class 'float'>>>> type(True)<class 'bool'>>>> type("aaa")<class 'str'>>>> type(5 / 2)<class 'float'>>>> type(5 // 2)<class 'int'>>>> type(2 > 3)<class 'bool'>
可以看到每行代码后会输出数据的类型,如 int,float,str,bool,其中两个整数进行 / 操作后是 float 类型,进行 // 操作后是 int 类型,进行 > 比较操作后是 bool 类型。
小提示 :暂时对 type 输出结果的格式不需要深究,class 表示类型的意思。
在对数据进行操作时,一定要注意操作的数据类型是什么,比如我们对两个字符串进行减法操作,就会报错,因为这在概念上就说不通,现实中也没有意义:
xxxxxxxxxx>>> '3' - '2'Traceback (most recent call last): File "<pyshell#29>", line 1, in <module> '3' - '2'TypeError: unsupported operand type(s) for -: 'str' and 'str'
思考 :字符串之间能否进行 / 操作,为什么?
但有时候我们真的需要一个把一个数字格式的字符串,如 '3' 进行数学运算,该怎么办?这就需要我们对数据进行类型转换,如下几个常用的内建函数用来进行类型转换:
int 类型float 类型str 类型 xxxxxxxxxx>>> int('3')3>>> str(3)'3'>>> float('3.2')3.2>>> str(3.2)'3.2'>>> int('3') - int('2')1
可以看到把字符串 '3' 和 '2' 分别转换成整型后,再进行减法操作,就不会报错了。需要注意的是,转换类型时,被转换的数据要和目标类型是兼容的,比如一个非整数格式,如字符串 'a' 要转换成整数,那就会报错:
xxxxxxxxxx>>> int('a')Traceback (most recent call last): File "<pyshell#40>", line 1, in <module> int('a')ValueError: invalid literal for int() with base 10: 'a'
思考:代码 str(3) * 2 会输出 '33' 还是 6 ,为什么?
由数据及其操作组成的式子叫做表达式,每个表达式都有一个值,前面知道每个值都有类型,所以每个表达式也有类型,前面我们敲过的代码其实都是表达式,也就是说在 Python 解释器里输入一个表达式回车后,下方会显示出表达式的求值结果,我们看一些复杂的表达式:
xxxxxxxxxx>>> 1 + 2 * 37>>> (1 + 2) * 39>>> 1 + 2 == 2 + 1True>>> abs(-3) * 26>>> 1 + 2 * 3 == (1 + 2) * 3False
可以看到在 Python 里会遵循一些基本的数学规则,如乘法比加法的优先级高,而括号能改变默认的优先级,除了这些规则,操作符优先级从高到低依次是:
记忆起来也很直观,前三条是数学规律,比较运算优先级显然要低于数学运算,因为得数学运算完得到数字后才能比较大小,相应的,得比较完大小得到布尔值后才能进行逻辑运算。
小提示:在记不住优先级规律时可以通过加括号来改变优先级,以确保表达式的求值过程符合自己的期望。
其实每个表达式能分解成一颗求值树,从树的叶子开始计算,最后计算到树的根,就是表达式的值,下面是 1 + 2 * 3 == (1 + 2) * 3 的树形表示。

思考:根据上面的规则,想一下 1 + 1 > 2 or 2 * 3 > 5 的结果是什么?
假设一个 4 个高 8 宽 5 的长方形,我们要求它们的总面积,可以直接写出代码
xxxxxxxxxx>>> (8 * 5) * 4160
但过一段时间再来看这段代码,有可能已经看不懂这些 8, 5, 4 是什么意思了,但给这些数字起个名字就会好很多,变量 就是用来给数据起名字的,看如下代码:
xxxxxxxxxx>>> height = 8>>> width = 5>>> count = 4>>> (height * width) * count160
前三行定义了 height, width 和 count 三个变量,分别用 8,5,4 进行 赋值,相当于给它们起了名字,这里出现一个新的操作符 = 叫 赋值操作符,它的作用是把右边的数据赋值给左边的变量。
数据有了名字,在使用它们时,就可以使用名字来代替它们了,如第 4 行,现在就容易理解多了,括号里是 height * width 计算出 1 个长方形的面积,然后再乘以一个数量 count,表示多个长方形面积的总和。
变量之所有叫变量,是因为它可以变,假如我们计算的长方形高度变为 9 ,只需要给 height 赋值 9 ,再做一遍计算即可。
xxxxxxxxxx>>> height = 9>>> (height * width) * count180
有没有发现,给变量赋值的代码,解释器并没有显示任何结果,因为这行代码不是表达式,而是一个 语句。表达式表示的是一个 值,而语句表示的是一个操作,这里具体指的是一个 赋值 的操作,而这样代码也叫赋值语句,后面我们还会学习更多类型的语句。
小提示:变量的名字只能由字母、数字和下划线组成,而且不能以数字开头。
思考:代码 "a" = 3 会不会报错,为什么?
既然数据可以通过变量起名字,那么一段操作可不可以也可以起一个名字,然后通过名字来执行呢?答案是可以的,具体就要用到函数,前面我们已经使用过 Python 自带的一些函数,如 abs,print 等,现在我们看下如何定义自己的函数:
xxxxxxxxxx>>> def area(height, width): return height * width>>> area(8, 5)40
这里信息量有些大,我们逐步来分析:
第 1 行进行函数定义, def 后跟一个函数名 area,紧跟着一对括号,括号里是两个逗号隔开的变量,这里叫做参数,末尾是一个冒号。
冒号下面的第 2 行代码叫函数体,表示函数具体的操作,可以看到这行代码没有顶格写,而是向右缩进了 4 个空格。这里还用到了一个 return 的功能,它用来把右面的表达式返回给函数的调用者。
函数体下面单独打了一个空行,表示函数定义完毕,然后会再出现 >>> 提示符。
第 4 行就是函数调用了,和使用内置函数一样 area(8, 5),就是函数名加括号,括号里传入要计算的数据,多个数据用逗号隔开。
函数是编程语言里非常重要的概念,一个函数相当于一台机器,有输入,有输出,有具体操作,函数定义一次可以多次调用,从而避免了很多重复的代码。
小提示 :
def 和 return 叫 关键字,是固定的写法,有明确的含义,比如前者用来定义函数,后者用来从函数中返回数据。8 和 5 叫做实参,因为它是实际调用函数的数据,而定义函数时的 height 和 width 只是形式上的参数,所以叫形参,函数真正执行时,实参会赋值给形参。要编写复杂的程序,需要编程语言提供两个重要的能力,一个是抽象,一个是组合。比如变量提供了对数据的抽象,函数提供了对操作的抽象,而表达式和语句可以把基本编程元素逐渐组合成比较复杂的程序。
看一个稍复杂的例子,打印出 4 个高 8 宽5 和 2 个高 4 宽 3 的长方形的面积总和:
xxxxxxxxxx>>> print(area(8, 5) * 4 + area(4, 3) * 2)184
我们已经学习了不少东西了,可以休息复习一下:
int,float,bool,str 类型来模拟现实世界数学运算符,比较运算符,逻辑运算符 和 字符串运算符 来对数据进行操作。True,False,def,return 大小写一定要正确,另外变量名也区分大小写,a 和 A 表示不同的变量。/ 操作,因为字符串之间的除法操作没有现实意义。str(3) * 2 会输出 '33' ,因为 str(3) 已经把 3 转换成了字符串,不是数字了,所以这里的 * 表示字符串的重复,不是数字乘法。1 + 1 > 2 or 2 * 3 > 5 表达式求值结果是 True,先进行数学运算,再执行比较运算,最后执行逻辑运算。"a" = 3 会报错,因为 "a" 是一个字符串,不是变量名。如果你真的读到了这里,说明你很有编程的潜力,关注我们公众号期待下次的更新吧。

下篇文章需要写更多的代码,需要在本机进行 Python 的安装,可参考菜鸟教程的这篇文章: Python 环境搭建