循环
#程序在一般情况下是按顺序执行的。编程语言提供了各种控制结构,允许更复杂的执行路径。循环语句允许我们多次执行一个语句或语句组。下图为大多数编程语言中循环语句的执行流程。
#我们已经知道条件为真(或假)时程序如何执行了,若想让程序重复执行,该怎么操作呢?比如输出1-100所有数字,是写100个输出语句吗?
1、while循环
1 #我们先看如何使用简单的程序输出1-10所有数字,示例如下: 2 #! /usr/bin/python3 3 # -*- coding:UTF-8 -*- 4 #while语句 5 6 n=1 7 while n<=10: 8 print('当前数字是:',n) 9 n+=1 10 #由输出程序看到,只需短短几行即可实现这个功能,我们看看输出结果。 11 =================== RESTART: D:\Python\workspace\while.py =================== 12 当前数字是: 1 13 当前数字是: 2 14 当前数字是: 3 15 当前数字是: 4 16 当前数字是: 5 17 当前数字是: 6 18 当前数字是: 7 19 当前数字是: 8 20 当前数字是: 9 21 当前数字是: 10 22 #由输出结果看到,按顺序输出了对应结果。 23 #该示例中使用了while关键字。在Python编程中,while语句用于循环执行程序,以处理需要重复处理的任务。基本语法形式为: 24 while 判断条件: 25 执行语句.... 26 #执行语句可以是单个语句或语句块。判断条件可以是任何表达式,所有非零、非空(null)的值都为真(true)。当判断条件为假(false)时,循环结束。 27 #while循环的执行流程如图所示。
#该流程图的意思为:首先对while语句条件判定,当条件为true时,执行条件语句块,执行完语句块在判定while条件,若条件为true,则继续执行语句块,直到条件为false时结束循环。
2、for循环
1 #上面我们了解了while循环,可以看到while语句非常灵活。例如以下代码: 2 #! /usr/bin/python3 3 # -*- coding:UTF-8 -*- 4 #for语句 5 6 n=0 7 fields=['a','b','c'] 8 while n<len(fields): 9 print('当前字母是:',fields[n]) 10 n+=1 11 #该代码实现的功能是将列表中的元素分别输出。该程序的实现没什么问题,我们是否由更好的方式实现这个功能呢?例如: 12 #! /usr/bin/python3 13 # -*- coding:UTF-8 -*- 14 #for语句 15 16 n=0 17 fields=['a','b','c'] 18 for f in fields: 19 print('当前字母是:',f) 20 #可以看到,代码比前面使用while循环时更简洁,代码量也更少。程序执行输出结果如下: 21 ==================== RESTART: D:/Python/workspace/for.py ==================== 22 当前字母是: a 23 当前字母是: b 24 当前字母是: c 25 #该示例使用了for关键字。在Pytho中,for关键字叫做for循环,for循环可以遍历任何序列的项目,如一个列表或字符串。 26 #for循环的语法格式如下: 27 for iterating_var in sequence: 28 statements(s) 29 #sequence是任意序列,iterating_var是序列中需要遍历的元素。statements是待执行的语句块 30 #for循环的执行流程如图所示:
1 #该流程图的意思为:首先对for条件判定,游标指向第0个位置,即指向第一个元素,看sequence序列中是否有元素,若有,则将元素赋值给iterating_var,接着执行语句块,若语句块需要获取元素值,则使用iterating_var的值,执行完语句块后,将序列的游标往后挪一个位置,再判定该位置是否有元素,若仍然有元素,则继续执行语句块,然后序列的游标再往后挪一个位置,直到下一个位置没有元素时结束循环。 2 #我们再看以下示例: 3 #! /usr/bin/python3 4 # -*- coding:UTF-8 -*- 5 #for语句 6 7 print('----for循环字符串------') 8 for letter in 'good': #for循环字符串 9 print('当前字母为:',letter) 10 11 print('----for循环数字序列------') 12 number=[1,2,3] 13 for num in number: #for循环数字序列 14 print('当前数字时:',num) 15 16 print('----for循环字典-------') 17 tups={'name':'小智','number':'1001'} 18 for tup in tups: #for循环字典 19 print('%s:%s'%(tup,tups[tup])) 20 #输出结果如下: 21 ==================== RESTART: D:/Python/workspace/for.py ==================== 22 ----for循环字符串------ 23 当前字母为: g 24 当前字母为: o 25 当前字母为: o 26 当前字母为: d 27 ----for循环数字序列------ 28 当前数字时: 1 29 当前数字时: 2 30 当前数字时: 3 31 ----for循环字典------- 32 name:小智 33 number:1001 34 #由上面的输入代码和输出结果看到,for循环的使用还是很方便的。 35 #因此能使用for循环,就尽量不要使用while循环。
3、循环遍历元素
1 #在前面的示例中,我们已经了解了使用for循环遍历字典的代码,代码如下: 2 #! /usr/bin/python3 3 # -*- coding:UTF-8 -*- 4 #循环遍历字典元素 5 6 tups={'name':'小智','number':'1001'} 7 for tup in tups: #for循环字典 8 print('%s:%s'%(tup,tups[tup])) 9 #可以看到,此处使用for循环对字典的处理看起来有些繁杂,是否还有别的方法更加直观呢? 10 #! /usr/bin/python3 11 # -*- coding:UTF-8 -*- 12 #循环遍历字典元素 13 14 tups={'name':'小智','number':'1001'} 15 for key,value in tups.items(): 16 print('%s:%s'%(key,value)) 17 #还记得我们前面的序列解包吗?for循环的一大好处是可以在循环中使用序列解包。 18 #输出结果如下: 19 ================== RESTART: D:/Python/workspace/循环遍历字典元素.py ================== 20 name:小智 21 number:1001 22 #由输入代码和输出结果看到,可以使用items方法将键/值对作为元组返回。 23 #字典中的元素是没有顺序的。也就是说,迭代时字典中的键和值都能保证被处理,但是处理顺序不确定。这也是用for虚幻输出字典中的元素时不按照顺序输出的原因。
4、迭代工具
1 #在Python中,迭代序列或其他迭代对象时,有一些函数非常有用。 2 3 ①、并行迭代 4 #程序可以同时迭代两个序列,示例如下: 5 #! /usr/bin/python3 6 #-*- coding:UTF-8 -*- 7 #迭代工具_并行迭代 8 9 student=['小明','小智','小强'] 10 number=[1001,1002,1003] 11 for i in range(len(student)): 12 print(student[i],'学号是:',number[i]) 13 #程序执行结果如下: 14 ================= RESTART: D:/Python/workspace/迭代工具_并行迭代.py ================= 15 小明 学号是: 1001 16 小智 学号是: 1002 17 小强 学号是: 1003 18 #在程序中,i是循环索引的标准变量名。 19 #在Python中,内建的zip函数用来进行并行迭代,可以把两个序列合并在一起,返回一个元组的列表,例如: 20 #! /usr/bin/python3 21 #-*- coding:UTF-8 -*- 22 #迭代工具_并行迭代_zip函数 23 24 student=['小明','小智','小强'] 25 number=[1001,1002,1003] 26 for name,num in zip(student,number): 27 print(name,'学号是:',num) 28 #程序执行结果和前面一样。 29 #zip函数可以作用于任意数量的序列,并且可以应付不等长的序列,当端序列“用完”时就会停止。 30 #! /usr/bin/python3 31 #-*- coding:UTF-8 -*- 32 #迭代工具_并行迭代_zip_range函数 33 34 for num1,num2 in zip(range(5),range(100)): 35 print('zip键值对为:',num1,num2) 36 #程序执行结果如下: 37 =========== RESTART: D:/Python/workspace/迭代工具_并行迭代_zip_range函数.py =========== 38 zip键值对为: 0 0 39 zip键值对为: 1 1 40 zip键值对为: 2 2 41 zip键值对为: 3 3 42 zip键值对为: 4 4 43 #由输出结果看到,zip函数以短序列为准,当短序列遍历结束时,for循环就会遍历结束。 44 #此处用到range函数,是Python3中的函数,在Python2版本中存在与这个函数功能类似的xrange函数。 45 46 ②、翻转和排序迭代 47 #在列表中学习过reverse和sort方法,此处介绍两个类似的函数--reversed和sorted函数。这两个函数可作用于任何序列或可迭代对象,但不是原地修改对象,而是返回翻转或排序后的版本。示例如下: 48 >>> sorted([1,5,2,7,1]) 49 [1, 1, 2, 5, 7] 50 >>> sorted('hello,world!') 51 ['!', ',', 'd', 'e', 'h', 'l', 'l', 'l', 'o', 'o', 'r', 'w'] 52 >>> list(reversed('hello,world!')) 53 ['!', 'd', 'l', 'r', 'o', 'w', ',', 'o', 'l', 'l', 'e', 'h'] 54 >>> ''.join(reversed('hello,world!')) 55 '!dlrow,olleh' 56 ##由输出结果看到,sorted函数返回的是一个列表,reversed函数返回的是一个可迭代的对象。在for循环和join方法中使用不会有任何问题,如果要对这两个函数使用索引、分片及调用list方法,就可以使用list类型转换返回对象。
5、跳出循环
1 #在前面的示例中讲了,循环会一直执行,直到条件为假或序列元素用完时才会结束。若我们想提前中断循环,比如循环的结果已经是我们想要的了,不想让循环继续执行而占用资源,有什么办法实现呢? 2 #Python提供了break、continue等语句可用于这种情形。 3 4 ①、break 5 #break语句用来终止循环语句,即使循环条件中没有false条件或序列还没有遍历完,也会停止执行循环语句。 6 #break语句用在while和for循环中。 7 #如果使用嵌套循环,break语句就会停止执行最深层的循环,并开始执行下一行代码。 8 #break语句语法如下: 9 break 10 #break语句的执行流程如下图所示:
1 #当遇到break语句时,无论什么条件,都会跳出这循环,例如: 2 #! /usr/bin/python3 3 #-*- coding:UTF-8 -*- 4 #break语句 5 6 for letter in 'hello': #示例1 7 if letter=='l': 8 break 9 print('当前字母是:',letter) 10 11 12 13 num=10 #示例2 14 while num>0: 15 print('输出数字为:',num) 16 num-=1 17 if num==8: 18 break 19 #输出结果如下: 20 =================== RESTART: D:/Python/workspace/break.py =================== 21 当前字母是: h 22 当前字母是: e 23 输出数字为: 10 24 输出数字为: 9 25 #由输出结果看到,在示例1中,输出语句输出循环遍历到的字符,当遇到指定字符时,跳出for循环。在示例2中,使用while做条件判定,在语句块中输出满足条件的数字,当数字等于8时,跳出while循环,不再继续遍历。 26 27 ②、continue 28 #continue语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环。 29 #continue语句用在while和for循环中。 30 #continue语句的语法如下: 31 continue 32 #continue语句的执行流程如图所示:
1 #当执行过程中遇到continue语句时,无论执行条件是真还是假,都跳过这次循环,进去下一次循环,例如: 2 #! /usr/bin/python3 3 #-*- coding:UTF-8 -*- 4 #continue语句 5 6 for letter in 'hello': #示例1 7 if letter=='l': 8 continue 9 print('当前字母是:',letter) 10 11 12 13 num=3 #示例2 14 while num>0: 15 num-=1 16 if num==2: 17 continue 18 print('当前数字为:',num) 19 #输出结果如下: 20 ================== RESTART: D:/Python/workspace/continue.py ================== 21 当前字母是: h 22 当前字母是: e 23 当前字母是: o 24 当前数字为: 1 25 当前数字为: 0 26 #由输出结果看到,相比于break语句,使用continue语句只是跳过一个循环,不会跳出整个循环。
6、循环中的else子句
1 #在开发的过程中,可能需要在while、for循环不满足条件时做一些工作,例如: 2 3 ①、在while循环中使用else语句 4 #在while条件语句为false时,执行else的语句块。 5 #! /usr/bin/python3 6 #-*- conding:UTF-8 -*- 7 #在while循环中的else子句 8 9 num=0 10 while num<3: 11 print(num,"小于3") 12 num=num+1 13 else: 14 print(num,'大于或等于3') 15 print('循环结束!') 16 #执行结果如下: 17 ================= RESTART: D:/Python/workspace/循环中的else子句.py ================= 18 0 小于3 19 1 小于3 20 2 小于3 21 3 大于或等于3 22 循环结束! 23 #由输出结果看到,while循环结束后执行了else语句中的语句块,输出“3 大于或等于3”语句。 24 25 ②、在for循环中使用else语句 26 #在for语句为false或结束后没有被break中断时,执行else的语句块,例如: 27 #! /usr/bin/python3 28 #-*- conding:UTF-8 -*- 29 #在for循环中的else子句 30 31 names=['xiaoming','xiaozhi'] 32 for name in names: 33 if name=='xiao': 34 print('名称:',name) 35 break 36 print('循环名称列表',name) 37 else: 38 print('没有循环数据!') 39 print('循环结束!') 40 #执行结果如下: 41 =============== RESTART: D:/Python/workspace/在for循环中的else子句.py =============== 42 循环名称列表 xiaoming 43 循环名称列表 xiaozhi 44 没有循环数据! 45 循环结束! 46 #由输出结果看到,for循环结束后执行了else语句块中的内容。
end