第八章:转圈圈
计算机程序通常会周而复始地重复同样的步骤,这叫做循环(looping)。循环主要分两类:
(1)计数循环(for):重复一定次数的循环
(2)条件循环(while):重复至某种情况时结束(只要条件为真,就会一直循环下去)
[注意:假如在调试循环的时候有bug,试试用ctrl+c停止]
8.1 计数循环
注意:一次循环就叫做迭代(iteration)。
另外,上面print的是hello,looper这个变量只是充当“计数”这个角色;但是当我们print出looper本身,会是什么样?
因此,复习一下python计数循环的格式:
for + 变量名 + in + [ 值1,值2,值3,...] +:
(千万不要忘了后面的冒号!)
需要注意的是,这里中括号和逗号的作用是组成“列表”。
列表这个概念,大概可以先理解为“容器”,用来存放东西;在循环这里,就是存放数值,等用到的时候拿出来用。(列表在第十二章会详细讲。)
8.2 使用计数循环
现在来一个高级点的任务:打印乘法表。
(我仿佛还记得被九九乘法表支配的恐惧……)
我想挑战一下九九乘法表,后来发现需要另一方面的知识,就先不展开讲了。
8.3 一条捷径——range()
上面我们要乘1-5,如果要乘1-1000,或1-10000呢?
这个时候,我们需要用到range函数。它相当于一条桥梁,只要告诉python前、后是什么,它就能圈好范围、自动将中间的数转化为值以进行循环。
现在写一个简单的、利用range函数乘大数程序:
需要注意的是,range(1,5)包含的是1,2,3,4这四个数,5是不包含在内的。这点非常重要,所以在使用range函数的时候,需要十分注意最后一个数的结束点。
8.4 风格问题——循环变量名
循环变量名没有特殊之处,它就是一个名字而已,但避免跟其他变量混淆,通常给循环变量取名,还是有些讲究的。这些讲究,是为了更易懂、更易于理解,也更易于调试,最终都是更易于合作。
譬如说,用looper这样有实际含义的名字,或是用i,j,k等作为循环变量(这里还有段故事,可以自己百度),通常会比较好。
range()的简写
for i in range ( 5 )
跟
for i in range ( 0, 5 )
是完全一样的,它们包含的数值,都是0,1,2,3,4(没有5!)
你可以发现:为什么会从0开始?
这是习惯问题,就算是以前,也是大把程序员在争论range到底是从0还是从1开始。可以说,无论是0还是1开始,只要确定好界限,保证结果正确,都是可以的。
另外再看看这个“循环字符”的函数:
结果会是什么呢?
会变成“竖式”是因为字符串的性质。字符串就像是一个字符的列表,每个位置都放了一个字符。而for.. in.. 这个计数循环,是使用列表来完成迭代的,所以上面的代码,表示的是“将字符串里面的每一个字符循环一次”,而循环一次就需要print一次,print函数都需要另起一行,所以最后的结果就像“竖式”啦!
8.5 按步长计数
目前为止,我们学习的都是增量为1的循环,也就是“向前走一步”;那我们可不可以调整一下增量,向前走五步、十步,甚至后退呢?
当然可以!秘诀就在给range函数设置一个额外的参数(argument),利用这个参数,我们可以将默认的增量1,改为不同的值:
注:参数有时候也称“形参”,在第十三章会有更多介绍。
接下来我们看两个代码:
接下来我们在做一个反向计数:
总之,一定要记住,range函数的第二个数,是永远不能到达的。
接下来,试着在函数中添加一些效果,如:
8.6 没有数字的计数
结合前面循环输出字符串,我们知道:循环的不一定是数字,也可以是字符串或其他。
为了验证这个结论,运行下面这个代码,看看会发生什么?
这儿的循环,是处理一个字符串列表,由python自行统计列表中要循环多少次。
但如果无法提前预知要迭代多少次呢?
8.7 无法预知的情况
之前我们用的都是for循环(计数循环)——当我们知道要循环多少次的时候,用for循环是最合适的。
但当我们只知道结束条件、不能确定具体要运行多少次的时候,for就不合适,而适合用while循环(条件循环)了。
8.8 跳出循环——break和continue
(1)跳过这个不循环:continue
有时候我们需要在循环中间退出,也就是在for循环结束计数前,或者在while循环找到结果前。
下面来看运行结果:
(2)完全跳出循环:break
就跟小标题一样,break是会让后面的循环都终止,直接结束。
有人认为break和continue的语句不好用,书本作者平时也很少用,不过确实有必要在学习的时候知道这两句语句的作用。
你学到了什么?
在这一章,我们学习了以下内容:
(1)for 循环——计数循环
(2)while循环——条件循环
(3)range函数:计算循环的捷径
(4)range函数的步长:第三个参数
(5)用continue语句跳到下一次迭代
(6)用break语句跳出循环
动手试一试
(1)编写一个程序,显示一个乘法表。开始时询问用户想显示哪个数的乘法表。
原以为很简单,结果莫名栽倒:
结果是:
尝试了用两个multiplier乘在一起,试错,果然知道了错误原因:
把rawinput的类型强制转换:
便得到了正确的结果。
(2)将第二题用另一种循环表示出来:
一开始,将for中的range函数强行加在while函数中,结果编不出任何东西:
接下来翻答案,才知道用到while函数的时候,要先设置looper为1,接下来在每次迭代中+1,才算是记上一次数:
上面是错误结果,下面是正确的运行结果:
(3)向乘法表在添加一个input,让用户能自己决定乘数和最大乘到几(建议for和while都试试):
运行结果:
小结
这一章主要是回顾了之前一直弄不懂的循环,其实理解了它们的原理、通过不同难度和层次的练习,小孩子真的也能够轻松学会。
接下来会继续探索算法!