电脑最强大、最擅长的事就是不怕累、不怕烦、默默无闻又肯干,而人却容易犯困、容易走神,且还经常会失手出错,但是对于电脑,只要咱们给它的程序指令是对的,它就会精准的按照程序指令执行。
小马:好啊!有什么强大的程序指令,可以让电脑不厌其烦的做事呢?
老马:当然有啦,今天我就给你讲一个非常重要,且经常用到的一个指令:“for”循环指令。
先看下面的一个例子,程序会把“我爱学Python”这句话(编程语言里面把这种带引号的内容称之为“字符串”)里面的一个个中文字包括英文字符取出来并在电脑屏幕上显示。
for zi in '我爱学Python':
print(zi)
详细解释一下,例子中的“zi”是定义的一个变量,用于在内存中存放数据的,变量名可以随意定义,这里其实是中文“字”的拼音而已;重要的是这里要学两个Python关键字:“for”和“in”,千万不要被这些英文单词的表象给吓住了,Python语言中总共才三十多个关键字,而且都是非常简单的英文单词,用多了,自然就熟了,不用死记,编程更重要的是锻炼思维,学会把日常生活或工作中的任务、难题转换成计算机可以理解的流程和算法,并快速编码实现,最后尽情享受其中的乐趣和成就感吧!
话说回来,“for”和“in”配合在一块,或者说这一条指令究竟在干什么呢?大家可以想象一下领奖的场景,领奖台上,领导给列队过来的一个个获奖代表成员发奖表彰,“in”后面跟的就是整个获奖代表队列,“for”后面跟的变量或者说这个领奖位置上站着的就是当前正在被颁奖的获奖代表。另外我们可以结合一下英文单词的本意来进一步加强理解,“for”在英文中可以翻译成“为、给,因为”,在我们的编程语境中则可以理解为:领导“为”或者“给”获奖代表颁奖,也可以理解为:颁奖的领导也许正在对当前获奖代表握手表示祝贺和感谢:“因为您的…杰出贡献,特颁此奖表示感谢和祝贺!”;另外,“in”在英文中可以翻译成“在…内”,领导颁奖的对象当然来自“in”后面的获奖代表队列,或者说只有在获奖代表队列里的成员才有资格接受领导的颁奖。
那么,颁的是什么大奖呢?你一定想知道,电脑也想知道呢!我们也得告诉电脑,否则它没法执行颁奖动作了,大家应该注意到了“for”所在语句后面有一个“:”,接着在该语句下面,即第2行,有一条指令,且该条指令在排版上是缩进的,这条指令就是领导依次对所有获奖代表执行的颁奖内容,为了简便起见,这里只列了一条颁奖内容的指令,实际上可以包含多条指令,唯一的要求是这些属于颁奖内容的指令必须跟在“:”下,且每条指令各占一行,并缩进排版,而且缩进都应该对齐啦,一般建议统一按4个空格缩进(指相比“for”所在语句缩进4个空格),冒号下这些对齐的代码行,我们称之为这个for循环下的“代码块”。另外,要特别注意一下,这里的“:”一定不能忘,且必须是英文输入法下输入的冒号,不可是中文冒号,否则,执行时会提示语法错误,而且这种错误往往对于编程入门者很不容易排查。
接下来解释一下“print”,究竟是干什么的呢?这是一个什么大奖呢?它相当于给正在被颁奖的获奖代表拍照露个脸!对于此行程序指令,通过“print”函数把变量“zi”所代表的汉字或者英文字符打印到屏幕上。“print”在我们编程中用得非常的频繁,因为电脑在运行过程中,当前程序被CPU执行到哪了?我们关注的、内存中的变量当前取值情况如何?无法直观的看得见,那么怎么办,可以通过“print”打印显示到屏幕上,而且,在输出显示的瞬间,我们可获知,当前CPU刚执行完“print”行。
“print”是python的一个内置函数,不同于前面讲到的“for”或者“in”这些关键字。对于“函数”,我们后面会专门进行讲解,这里仅简单描述一下,函数用于把一定功能的程序代码封装起来,供更方便的使用,就像咱们在日常生活中用的各种小工具一样,比如钳子、扳手、螺丝刀等,函数名则代表着这些工具名,在定义函数的时候可以根据需要随意起名,因为“print”函数是python编程环境已经内置(编写并封装好了)的函数,所以我们直接可以调用,另外,大家可能已经注意到,“print”后面有个括号,我们通过括号为函数传入参数,以控制程序的运行,就像咱们在使用螺丝刀时,可以为螺丝刀配置大小不一的“一字(负号)”头或者“十字(正号)”头,我们把需要打印输出的内容以参数的形式传给“print”即可。
那么接下来,我们看看这段程序运行的“print”输出是什么样的呢?
我
爱
学
P
y
t
h
o
n
结合上面讲到的,对比程序执行结果,再稍解释一下:
- 电脑先运行第1行,从字符串中取出“我”,赋值给“zi”这个变量;
- 然后运行第2行,打印输出“zi”变量当前所代表的字符串,即打印输出“我”;
- 接着电脑又返回到第1行,从字符串中取出“爱”,赋值给“zi”这个变量;
- 然后运行第2行,打印输出“zi”变量当前所代表的字符串,即打印输出“爱”;
- …
如此循环,直到字符串中所有的字或者英文字符都被遍历取完为止。
接下来,我们总结一下for循环的运行流程,如下图所示。
Created with Raphaël 2.2.0 开始执行for循环 从“代表集”中依 次取出一个“代表” 成功取出了吗? (因为有可能 “代表集”是空的, 或者已经取完 了。) 用取出的“代表”执行“:” 下面缩进的“代码块” for循环执行完毕 yes no
我们再看一个例子:
kecheng = ["语文","数学","英语","体育"]
for xueke in kecheng:
print(xueke)
执行结果如下:
语文
数学
英语
体育
在上面这个例子中,我们先定义了一个变量kecheng,并给这个变量赋值了一个列表,后面我们会专门讲解列表,在这里我们可以把它看作是一个有序的数据集,列表里的每一项都是一个字符串。在for循环里,列表中的每一项字符串被作为一个整体取出来,并打印显示。
我们再时光倒流返回到上一节结尾时提到的代码,然后用我们在这一节学到的东西看能否理解这段代码呢?
sum = 0
for i in range(1,101):
sum = sum + i
print("sum =",sum)
执行结果如下:
sum = 5050
这里提醒三个地方:
- 这里的“range”也是一个内置函数,它会返回一个整数列表,就像上面例子中kecheng变量的类型一样,只不过这次列表中装的是数,而不是字符串,另外,给这个函数传入了两个参数,第一个参数表示列表起始项的值,为1,第二个参数,表示对列表截止项的控制,必须小于101,最终通过“range”函数的调用,会产生了一个数字列表:1、2、3、4…一直到100。这个函数是不是很方便,也很有用啊?要是没有它,自己对列表中的数一个一个的写是不是很麻烦也很容易出错啊。
- 需要注意的是,这个例子里,“print”不在for循环的“代码块”中,所以print没有缩进,而是跟for语句对齐的,因此print只会被调用一次。
- 这次print被传入了两个参数,第一个为字符串,第二个为sum这个存储结果的数字变量,print会依次把他们都打印显示出来,并且在他们显示的结果中间增加一个空格加以区分。
小马:有了这三条提醒就完全明白了,通过for循环,i依次从列表中取出一个数来,然后把这个数与sum这个变量相加,相当于累计到sum这个变量中。
老马:对了。容易忽略的是第一行,累计前一定要先把sum清零。
截至到目前这几节我们一直在纸上谈兵,大家一定跃跃欲试想自己编程并让电脑运行着试一试,那么下一节我们就谈谈如何搭建编程及运行环境。