循环,英文名loop。
用于比喻周而复始、花开花谢、月圆月缺、循环无尽。
我记得法国作家罗曼·罗兰曾经说过「多数人二十或三十多岁已经死了,他们变成自己的影子,不断重复以前的自己」。
当初看到这句话时我会想了过去我生命中的前三十年,我可以理直气壮的说:“那我应该要做那少数人,因为作为一个程序员,我不允许我的生活不断的重复以前的自己,这也是我上一章提到过的,不要重复你自己(DRY原则)”。
人生不要重复,但计算机可以,甚至我们要利用计算机的特性把重复大搞特搞,只有当计算机按照我们的想法不断的循环运行着那些永无止境重复的任务,我们的身体和精神才能解脱出来,把宝贵的生命留给更多的有意思的事物上。(人生苦短,请用python)
本章知识点:
for循环while循环今天我们来讲python的循环语句,以forin和while两种为主。
for循环
首先我们来看看for循环的语法
for变量名in迭代对象(列表,字典,元组,字符串等):
代码块
在python中for循环可以遍历任何序列的项目,如一个列表或者一个字符串。
就像宇宙大爆炸之后就先有了第一缕光,每一种编程语言一开始就有了循环语句一样。
我们在之前的python基础教程里或多或少已经看到过循环的语法,通常是forin这样的格式,叫做for循环,在其他(C语言、JAVA、js等绝大多数)语言中均有for循环这个语句,仅仅是写法可能有些细微的区别。
来我们先来看看C语言的for循环语法。
是不是有点复杂?比起来还是下面python的更适合初学者理解一些。如图所示我们创建了一个简单的循环,从1到5依次循环,并打印5个数字。
当循环开始时,程序会在第一行和第二行来回的切换执行。
1:第一行首先通过range(5)产生一个可用于迭代的对象,下标位从0开始,也就是(0,1,2,3,4)。
注意:range不会直接产生一个元组或列表对象,它只会在被循环(迭代)的时候才动态的去取出值,这是它的一个特性,为了节省内存空间,定义时不申请,只在使用时申请。
2:给变量i赋予当前range(5)的起始值后,程序自动流转到第二行,打印当前变量i的值,也就是打印0。
3:print函数结束后,程序自动判断当前执行次数,如果还没满足5次,就回到第一行将(0,1,2,3,4)中的第二个值,也就是1继续赋值给变量i。
4:程序继续流转到第二行,打印当前变量i的值1。
程序这样周而复始,直到循环5次后结束本次循环体。
下面这个动画用于说明变量i的变化和语句之间的跳转,做得比较粗糙,见谅。
多层循环
前面讲if条件语句时我们用到了嵌套if条件语句,在循环里,我们同样可以嵌套,下面看一个例子。
来解释一下程序的运行过程。
1:程序从第一个循环开始,首先进入第2行。
2:打印了“外层嵌套0”这么一句话,接着进入第三行的循环区块里。
3:forjinrange(3)这里表面需要循环三次,所以在这个循环体里连续运行并打出了3行文字。
“内层循环0、1、2”
4:直到内层的三次循环结束,又回到上一层循环中,继续下一个轮回。
如果循环的层级数足够的多,程序就像在盗梦空间里穿越一般,一层层的下去,直到迷失在里面(可能是死机)。
所以我们平时在编写代码逻辑时,需要尽量把功能模块拆分开,不要用超过2-3层循环去做一件事情,第一是程序运行速度可能会变慢,第二是这样也不利于我们清晰的分析代码。
循环中的变量作用域
当前循环体里只能用到自己或者更上层(1层或多层)循环体里的变量值,无法用到下层循环体里的变量值。代码例子循环中i和j变量是每次通过forin语句一个迭代对象临时产生并赋值给变量的,如果在上层循环使用下层循环的,会出现变量未定的报错。下层循环可以用到上层循环forin所产生的变量,这个时候变量的值是当前上层循次数值。
9*9乘法表
现在我们用双层循环来打印一个9*9乘法表吧。
因为9*9乘法表需要从1开始,于是我们在range里的起始值就是1,结束值是10,正好可以取到1-9、9个数字,至于为什么不取10,这牵扯到一个所谓语法解析里左闭右开区间的规则,python的这个规则和别的语言基本一致,这里不详细展开。
我们只需要简单的理解为最后一位10就是我们跳出循环的条件即可,当数字要等于10或者别的上限值的时候,跳出当前循环。
这个9*9乘法表大家可以用我开始那个动画图的方式,自己在纸上模拟一下,看看为什么得出这个结果,至于第三行print的用法是为了在屏幕上排版好看而已,你也可以不用这么排版。
第四行的print()作用可以理解为换行。
while循环
相比起for循环来说,while循环更像是一束从宇宙深处穿射出来的光线,奔向不知深处的尽头,在没有人阻止它之前,它会不知疲倦不会消亡的一直前行下去。
如果把上面这段话翻译得通俗一点应该就是,while像一个不撞南墙不回头的倔小子。
看看while的语法:
while逻辑表达式(True或者False):
循环体里要执行的语句
如果逻辑表达式为True,那while就一直循环,否则就停止循环。
上面这段代码我用到了while循环打印当前系统事件。
因为while循环一旦跑起来就收不住,于是我用time.sleep()这个函数做了一个两秒的休眠时间,所以程序每隔两秒才打印一次时间。
然后直到我强行停止程序才会结束。
想想看,如果我去掉那个2秒的时间休眠会怎么样?
这就收不住了,系统会在一秒钟内打印很多条时间记录,应该是微秒级别的,能打多少条取决于我的电脑有多快。。。。。。
如果我们想结束while循环该怎么做呢?没错,设置while语句后面的逻辑表达式为False。
解释下以上代码。
我们设置了一个计数器,变量为count,赋值1。然后设定while循环的条件是count小于等于5,条件为真,于是开始进入循环体。打印当前count的值和时间每次在循环里都对当前count的数字加1,于是count的值会随着循环的次数不断的增加。当count的值加到6时,不符合count=5的循环条件了,退出循环。因为不会再进入循环里,所以不会再打印count的值为6,但实际上这个时候count在内存里的值确实是6。可能有机智的朋友会想到,while循环能嵌套吗?当然可以,只要不怕程序迷失,结束条件清晰,不管怎么嵌套都行。
for循环嵌套while,while里面又嵌套for,怎么组合都随心所欲。
还有控制循环的break和continue语句将在以后的时间里讲到,今天大家先消化for和while的基本用法吧。
关于循环,我们能用它干的事情很多。
创建一个网络服务,接受客户端的请求并进行处理,只要计算机不挂掉,它就永不停止。打开一个Excel文件,循环读取每一行或者每一列的数据,在内存中处理完数据后再保存起来。循环产生万条随机加密的字符串,用于某个产品的防伪认证标志,流向市场。写一个程序,每天早上8点给自己发消息提醒今天一天的事项安排,中午12点发消息提醒自己该吃饭了等等,每天不间断,周而复始,这相当于条件判断和循环语句的结合使用。总结:
从以上两种循环我们得出一个大致的结论就是。
for循环是在一个预先给定好的、有限的范围内进行循环,直到循环次数等于或大于这个给定范围上限,退出当前循环。
while循环是一开始就会循环起来,除非我们给他一个明确的停止条件(True,False)。
我们一生要干的事情很多,请尽量减轻我们的重复工作量吧。当我们要去优化一件事情的流程时,我们首先要观察它是否是一件重复的工作,每次重复之间有哪些一样或者不一样的变化,用变量去解决它们,然后丢给计算机,我们坐下来喝喝茶,大脑放空,思考人生。
去创造更有价值的事物,这就是人和人工智能的区别!