循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12

第八章:转圈圈

计算机程序通常会周而复始地重复同样的步骤,这叫做循环(looping)。循环主要分两类:

(1)计数循环(for):重复一定次数的循环

(2)条件循环(while):重复至某种情况时结束(只要条件为真,就会一直循环下去)

[注意:假如在调试循环的时候有bug,试试用ctrl+c停止]

8.1 计数循环

一个最简单的循环,for..in [循环体]
循环结果

注意:一次循环就叫做迭代(iteration)。

另外,上面print的是hello,looper这个变量只是充当“计数”这个角色;但是当我们print出looper本身,会是什么样?

循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第1张图片
跟上次不一样,print的是looper这个变量
循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第2张图片
可以看到,后面的循环体的每个值,都赋值给了looper

因此,复习一下python计数循环的格式:

for  + 变量名 + in + [ 值1,值2,值3,...] +:

(千万不要忘了后面的冒号!)

需要注意的是,这里中括号和逗号的作用是组成“列表”。

列表这个概念,大概可以先理解为“容器”,用来存放东西;在循环这里,就是存放数值,等用到的时候拿出来用。(列表在第十二章会详细讲。)

8.2 使用计数循环

现在来一个高级点的任务:打印乘法表。

(我仿佛还记得被九九乘法表支配的恐惧……)

1*9的算法
循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第3张图片
做出来了,挺简单

我想挑战一下九九乘法表,后来发现需要另一方面的知识,就先不展开讲了。

8.3 一条捷径——range()

上面我们要乘1-5,如果要乘1-1000,或1-10000呢?

这个时候,我们需要用到range函数。它相当于一条桥梁,只要告诉python前、后是什么,它就能圈好范围、自动将中间的数转化为值以进行循环。

现在写一个简单的、利用range函数乘大数程序:

循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第4张图片
事实上到第二个的时候,程序仿佛是停不下来了
循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第5张图片
在这里的时候,我用了ctrl+c来停止

需要注意的是,range(1,5)包含的是1,2,3,4这四个数,5是不包含在内的。这点非常重要,所以在使用range函数的时候,需要十分注意最后一个数的结束点。

注意range的范围
循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第6张图片
range的范围要减一,just like this

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开始,只要确定好界限,保证结果正确,都是可以的。

另外再看看这个“循环字符”的函数:

跟前面不同,循环体变成了字符

结果会是什么呢?

循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第7张图片
并不是循环多次,而是变成了“竖式”

会变成“竖式”是因为字符串的性质。字符串就像是一个字符的列表,每个位置都放了一个字符。而for.. in.. 这个计数循环,是使用列表来完成迭代的,所以上面的代码,表示的是“将字符串里面的每一个字符循环一次”,而循环一次就需要print一次,print函数都需要另起一行,所以最后的结果就像“竖式”啦!

8.5 按步长计数

目前为止,我们学习的都是增量为1的循环,也就是“向前走一步”;那我们可不可以调整一下增量,向前走五步、十步,甚至后退呢?

当然可以!秘诀就在给range函数设置一个额外的参数(argument),利用这个参数,我们可以将默认的增量1,改为不同的值:

注:参数有时候也称“形参”,在第十三章会有更多介绍。

参数就是后头这个,表示“步长”

接下来我们看两个代码:

首先看从1开始数的计数循环函数
输出的是这个东西,所以说建议开头从0开始,会比较不容易出错
接下来是从0开始的
就正确了!

接下来我们在做一个反向计数:


简单是简单,但还不够严谨,中间应为-101
否则就没有了最后的-100

总之,一定要记住,range函数的第二个数,是永远不能到达的。

接下来,试着在函数中添加一些效果,如:

循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第8张图片
倒计时:加入了时间函数,隔一秒再显示

8.6 没有数字的计数

结合前面循环输出字符串,我们知道:循环的不一定是数字,也可以是字符串或其他。

为了验证这个结论,运行下面这个代码,看看会发生什么?

有些小错误后来改了
循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第9张图片
运行结果

这儿的循环,是处理一个字符串列表,由python自行统计列表中要循环多少次。

但如果无法提前预知要迭代多少次呢?

8.7 无法预知的情况

之前我们用的都是for循环(计数循环)——当我们知道要循环多少次的时候,用for循环是最合适的。

但当我们只知道结束条件、不能确定具体要运行多少次的时候,for就不合适,而适合用while循环(条件循环)了。

循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第10张图片
使用了while循环,只要输入为3,条件就一直为真,程序就会一直运行下去
循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第11张图片
退出时输入了个空格,输入不为3,因此退出

8.8 跳出循环——break和continue

(1)跳过这个不循环:continue

有时候我们需要在循环中间退出,也就是在for循环结束计数前,或者在while循环找到结果前。

循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第12张图片

下面来看运行结果:

循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第13张图片
注意continue语句,让i=3这里的循环体没完成,而是提前跳到了下一句

(2)完全跳出循环:break

就跟小标题一样,break是会让后面的循环都终止,直接结束。

循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第14张图片
循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第15张图片

有人认为break和continue的语句不好用,书本作者平时也很少用,不过确实有必要在学习的时候知道这两句语句的作用。


你学到了什么?

在这一章,我们学习了以下内容:

(1)for 循环——计数循环

(2)while循环——条件循环

(3)range函数:计算循环的捷径

(4)range函数的步长:第三个参数

(5)用continue语句跳到下一次迭代

(6)用break语句跳出循环


动手试一试

(1)编写一个程序,显示一个乘法表。开始时询问用户想显示哪个数的乘法表。

原以为很简单,结果莫名栽倒:

结果是:

循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第16张图片

尝试了用两个multiplier乘在一起,试错,果然知道了错误原因:

循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第17张图片
果然是字符串没转化的问题

把rawinput的类型强制转换:

便得到了正确的结果。

循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第18张图片

(2)将第二题用另一种循环表示出来:

一开始,将for中的range函数强行加在while函数中,结果编不出任何东西:

接下来翻答案,才知道用到while函数的时候,要先设置looper为1,接下来在每次迭代中+1,才算是记上一次数:

上面是错误结果,下面是正确的运行结果:

循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第19张图片

(3)向乘法表在添加一个input,让用户能自己决定乘数和最大乘到几(建议for和while都试试):

循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第20张图片
for循环,range函数末尾要记得加1
循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第21张图片
while循环也是要记得末尾加1

运行结果:

循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12_第22张图片
最后的乘数出来啦~

小结

这一章主要是回顾了之前一直弄不懂的循环,其实理解了它们的原理、通过不同难度和层次的练习,小孩子真的也能够轻松学会。

接下来会继续探索算法!

你可能感兴趣的:(循环就像转圈圈——父与子的编程之旅 学习笔记(6)2018-07-12)