[ 导读 ]本文重点讲述 for 语句和 while 语句. for 语句属于遍历循环, while 语句属于当型循环. 除了两个循环语句外, 还介绍了 break,continue 与 pass 三个用于控制循环结构中的程序流向的语句. 在此基础之上, 也介绍了列表推导式, 这是一种特殊的循环语句.
循环语句又称为重复结构, 用于反复执行某一操作. 面对大数量级的重复运算, 即使借助计算机, 重复编写代码也是费时的, 这时就需要借助循环语句. 使用循环语句一般要用到条件判断, 根据判断式的返回值决定是否执行循环体.
循环分为两种模式, 一种是条件满足时执行循环体, 另一种则相反, 在条件不满足时执行循环体. 前者称为当型循环, 后者称为直到型循环.
在图 1 中, 虚线框内是一个当型循环结构, 此结构包含判断条件和循环体, 以及连接各部分的流向线. 程序执行时, 先判断条件的真假. 判断为真时, 则执行循环体; 判断为假时, 不再执行循环体, 循环结束. 当型循环先进行条件判断, 如果满足循环条件, 再执行循环体, 因此又被称为前测试型循环.
在图 2 中, 虚线框内是一个直到型循环结构, 此结构包括判断条件和循环体, 以及连接各部分的流向线. 程序执行时, 先执行一次循环体, 再判断执行循环的结果是否满足判断条件. 满足条件时, 再次执行循环体; 不满足条件时, 不再执行循环体. 直到型循环在执行判断前先进入循环体运行, 因此又被称为后测试型循环.
Python 中主要有两种循环语句, 即 for 语句和 while 语句. 前者采用遍历的形式指定循环范围, 后者视判断式返回值的情况而决定是否执行. 要更灵活地操纵循环的流向, 就要用到 break,continue 和 pass 等语句.
01 for
for 循环是迭代循环, 在 Python 中相当于一个通用的序列迭代器, 可以遍历任何有序序列, 如 str,list,tuple 等, 也可以遍历任何可迭代对象, 如 dict. 不同于 C 语言, Python 中的 for 语句将遍历系列中的所有成员, 遍历顺序为成员在系列中的顺序. 需要注意, 在 for 循环中改变任何序列的内容都是危险的!
for 语句不属于当型循环或直到型循环, 它遍历序列对象内的元素, 对每个元素运行一次循环体, 循环的步数在程序开始执行时已经指定, 不属于条件判断.
在 for 语句中, for 和 in 搭配组成 for-in 循环结构, for-in 循环依次把 list 或 tuple 中的每个元素迭代出来. for 语句的基本语法格式如下:
for 变量 in 序列:
操作语句
for 语句常用的语法格式及其参数说明如下所示:
序列: 接收序列, 表示遍历范围, 无默认值
操作语句: 接收操作语句, 表示执行一段代码, 无默认值
程序的执行从 "for 变量 in 序列" 开始, 该语句把序列中的每个元素代入变量, 执行一遍操作语句 1, 重复的次数就是序列中元素的个数.
为了展示 for 循环的遍历功能, 依次打印 list 中的姓名, 如代码清单 1 所示.
代码清单 1:for 语句遍历提取 str
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群: 857662006 寻找有志同道合的小伙伴, 互帮互助,
- 群里还有不错的视频学习教程和 PDF 电子书!
- '''
- # 单纯遍历的 for 语句
- names = ['Michael', 'Bob', 'Tracy']
- # 遍历输出 names 中的元素
- for name in names:
- print(name)
输出结果:
Michael Bob Tracy
for 语句同样可以实现 dict 的遍历方法, 如代码清单 2 所示.
代码清单 2:for 语句遍历查询 dict
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群: 857662006 寻找有志同道合的小伙伴, 互帮互助,
- 群里还有不错的视频学习教程和 PDF 电子书!
- '''dic = {'a': 1,'b': 2,'c': 3,'d': 4}
- # 遍历键值对
- print('key_value:', end = '')
- for key, value in dic.items():
- print(key, value, sep = ':', end = ' ')
- # 遍历键
- print('keys:', end = '')
- for key in dic.keys():
- print(key, end = ' ')
- # 遍历值
- print('values:', end = '')
- for value in dic.values():
- print(value, end = ' ')
输出结果:
- key_value:a:1 b:2 c:3 d:4
- keys:a b c d
- values:1 2 3 4
从代码清单 2 可以看到, for 语句中用于遍历的 "变量" 不仅可以是 Python 默认的指代词, 也可以是常规的变量.
和条件语句一样, 循环语句也可以使用嵌套, 作用同样是丰富程序的功能性. 设计一个成绩录入系统, 就必然要录入姓名和课程这两类信息, 仅靠一层循环是无法实现的, 可使用两层循环结构, 如代码清单 3 所示.
代码清单 3: 嵌套 for 语句
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群: 857662006 寻找有志同道合的小伙伴, 互帮互助,
- 群里还有不错的视频学习教程和 PDF 电子书!
- '''students = ['一号','二号']
- subjects = ['语文', '数学']
- sum1 = []
- avg = []
- for i in students:
- print ('开始录入 %s 的考试成绩!'%i)
- sum = 0
- for j in subjects:
- print('请输入 %s 成绩:'%j)
- score = int(input())
- sum += score
- average = sum / 2
- avg.append(average)
- sum1.append(sum)
- print(students, '的总分依次是', sum1, ',', '平均分依次是', avg)
- print('完成成绩录入!')
输出结果:
开始录入一号的考试成绩!
请输入语文成绩:
97
请输入数学成绩:
90
开始录入二号的考试成绩!
请输入语文成绩:
89
请输入数学成绩:
100
['一号', '二号'] 的总分依次是 [187, 189] , 平均分依次是 [93.5, 94.5]
完成成绩录入!
理论上, for 循环也可以无限嵌套, 但并不推荐.
02 while
while 语句是 Python 中最常用的递归结构. 区别于 for 循环, while 循环结构包含条件判断式, 是一种条件循环, 属于当型循环.
while 语句最基本的形式包括一个位于顶部的布尔表达式, 一个或多个属于 while 代码块的缩进语句. 也可以在结尾处包含一个 else 代码块, 它与 while 代码块是同级的, 组成 while-else 的形式. while 语句的基本语法格式如下.
while 条件表达式:
操作语句 1
操作语句 2
while 语句常用的参数及其说明如下所示:
条件表达式: 接收布尔表达式, 表示判断条件是否成立. 无默认值
操作语句: 接收操作语句, 表示执行一段代码. 无默认值
执行 while 语句时, 只要顶部的条件表达式返回真值, 就一直执行 while 部分嵌套的递归代码, 当条件表达式返回假值时, 不再执行操作语句, 程序跳出 while 结构.
while 语句的基础使用方法如代码清单 4 所示.
代码清单 4:while 语句
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群: 857662006 寻找有志同道合的小伙伴, 互帮互助,
- 群里还有不错的视频学习教程和 PDF 电子书!
- '''
- sum = 0
- n = 99
- while n> 0:
- sum += n
- n -= 2
- print(sum)
输出结果: 2500
如果布尔表达式不带有<,>,==,!=,in,not in 等运算符, 仅仅给出数值之类的条件, 也是可以的. 当 while 后写入一个非零整数时, 视为真值, 执行循环体; 写入 0 时, 视为假值, 不执行循环体. 也可以写入 str,list 或任何序列, 长度非零则视为真值, 执行循环体; 否则视为假值, 不执行循环体.
如果布尔表达式始终返回 1,while 语句就变成无限循环, 如代码清单 5 所示.
代码清单 5:while 语句无限循环
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群: 857662006 寻找有志同道合的小伙伴, 互帮互助,
- 群里还有不错的视频学习教程和 PDF 电子书!
- '''
- # 布尔表达式为常数 1, 始终为真值
- while 1:
- print('循环')
输出结果:
循环
循环
- ...
- # 布尔表达式每次递归运算都为 2, 始终为真值
- x, y = 2, 1
- while x / y:
- print('循环')
- x = x * 2
- y = y * 2
输出结果:
循环
循环
...
运行代码清单 5, 将会不断打印出 "循环". 代码清单 5 展示了制造无限循环的两种方式, 既可以在 while 后写入一个固定的真值, 也可以写入一个一直生成真值的表达式. 要终止无限循环, 可以使用快捷键 Ctrl+C 中断循环的执行, 也可以用循环终止语句, 这将在下文中介绍.
灵活地利用 while 语句中的布尔表达式及代入表达式的递归值, 可以实现特别的功能, 如代码清单 6 所示.
代码清单 6:while 语句实现 str 截取
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群: 857662006 寻找有志同道合的小伙伴, 互帮互助,
- 群里还有不错的视频学习教程和 PDF 电子书!
- '''string ='abcd'
- while string:
- print(string)
- # 该语句的递归计算是, 每次从 str 的第 2 个字符开始截取
- string = string[1:]
输出结果:
abcd
bcd
cd
d
代码清单 6 包含一个自减迭代值, 它并不通过明显的运算符实现自减, 而是利用索引法则, x 变量一直从 str 中第 2 个值截取至结尾, 每次都将位于 str 最前面的字符截取掉, 最终只剩下一个字符时, 再次截取就只有空的结果, 布尔表达式返回 0, 循环终止.
通过代码清单 5 和代码清单 6 可以看到, 灵活地利用递归式, 可以实现程序流向的控制.
while 循环同样可以使用嵌套, 嵌套的 while 循环实现成绩录入系统如代码清单 7 所示.
代码清单 7: 嵌套 while 语句
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群: 857662006 寻找有志同道合的小伙伴, 互帮互助,
- 群里还有不错的视频学习教程和 PDF 电子书!
- '''
- j = 1
- while j <= 2:
- sum = 0
- i = 1
- name = input('请输入学生姓名:')
- while i <= 2:
- print ('请输入第 %d 门的考试成绩:'%i)
- sum += int(input())
- i += 1
- avg = sum / (i-1)
- print(name, '的平均成绩是 %d'%avg)
- j += 1
- print('学生成绩输入完成!')
输出结果:
请输入学生姓名: 一号
请输入第 1 门的考试成绩:
98
请输入第 2 门的考试成绩:
88
一号 的平均成绩是 93
请输入学生姓名: 二号
请输入第 1 门的考试成绩:
65
请输入第 2 门的考试成绩:
100
二号 的平均成绩是 82
学生成绩输入完成!
代码清单 7 的第 1 层 while 语句用于录入人名, 第 2 层则在各人名下录入多门成绩, 布尔表达式决定录入的人数和课程数.
03 break,continue 与 pass
在前两节中, 已经介绍了 Python 中的两种循环语句. 循环语句中还可以嵌入 break,continue 和 pass 语句, 以灵活地改变流向, 实现更多功能.
1. break
在 Python 中, break 语句用于终止循环语句的执行. 使用该语句时, 即使循环条件判断为真, 或序列未被完全递归, 循环语句也会被立刻停止.
break 语句一般配合条件判断使用, 因为程序的终止必须是在某一条件被满足时执行. break 语句在 for 循环和 while 循环中的使用如代码清单 8 所示.
代码清单 8:break 语句的使用
- # break 语句用于 for 循环
- string = "Python"
- for i in string:
- # 遍历至 string 中的字符 n 时, 不再执行 else 代码块
- if i == 'n':
- break
- else:
- print("letter:{}". format(i))
输出结果:
- letter:P
- letter:y
- letter:t
- letter:h
- letter:o
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群: 857662006 寻找有志同道合的小伙伴, 互帮互助,
- 群里还有不错的视频学习教程和 PDF 电子书!
- '''
- # break 语句用于 while 循环
- counts = 0
- while True:
- print(counts)
- counts += 1
- # 满足 counts 等于 3 时跳出循环, 不再进入循环体
- if counts == 3:
- break
输出结果:
0 1 2
从代码清单 8 可以看到, break 语句用于 for 循环和 while 循环是有区别的. 用于 for 循环时, 只终止遍历中某一次的循环体执行; 用于 while 循环时, 整个循环被终止.
break 只终止本层循环, 如有多层嵌套的循环, 在其中一层循环中写入 break, 只在这层循环中生效, 程序将跳到上一层循环中继续运行, 如代码清单 9 所示.
代码清单 9:break 语句用于嵌套循环结构
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群: 857662006 寻找有志同道合的小伙伴, 互帮互助,
- 群里还有不错的视频学习教程和 PDF 电子书!
- '''
- # 第 1 层循环, 遍历次数为 2
- for i in range(2):
- print("-----%d-----" %i)
- # 第 2 层循环, 遍历次数为 10
- for j in range(10):
- # 使用 break 语句, j>1 时不执行循环体
- if j> 1:
- break
- print(j)
输出结果:
- -----0-----
- 0
- 1
- -----1-----
- 0
- 1
在代码清单 9 中, break 语句在条件判断式 "if j>1:" 后被使用, 因此尽管 j 的指定遍历次数为 10, 实际上遍历只运行两次. 由于 break 语句只终止本层循环的运行, i 依旧遍历执行了两次, 而不是在第 1 次遍历过程末尾终止.
2. continue
Python 中的 continue 语句用于跳出当前循环, 并执行下一次循环, 而 break 跳出整层循环, 两者的功能具有明显区别.
如果一段代码中包含 continue 语句, 循环执行至 continue 处时, 先忽略本次循环, 在本层仍满足条件的剩余循环次数中继续执行, 不会终止这一层循环. 实际上, 如果在某一层的每次循环中都使用 continue 语句, 就相当于使用 break 语句.
打印一个数表, 要不打印某些指定的数字, 或只打印某类数, 就可以使用 continue 语句跳过一些循环次数, 该语句在 for 循环和 while 循环中都可以自由地使用, 如代码清单 10 所示.
代码清单 10:continue 语句用于循环结构
- # 当 i 等于 1 或 3 时, 跳过 continue 后的 print 语句
- for i in range(0,5):
- if i == 1 or i == 3:
- continue
- print(i)
输出结果:
- 0
- 2
- 4
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群: 857662006 寻找有志同道合的小伙伴, 互帮互助,
- 群里还有不错的视频学习教程和 PDF 电子书!
- '''
- # 如果遇到偶数, 跳过 continue 后的 print 语句
- counts = 0
- while counts <10:
- counts += 1
- if counts % 2 == 0:
- continue
- print(counts)
输出结果:
1
3
5
7
9
break 语句一旦用于嵌套循环中的第 n 层, 该层循环会被终止, 但在执行第 n-1 层循环时, 仍会创造一个第 n 层循环并执行. continue 语句同样如此, 只是仍会执行某一层的剩余部分. 因此, 无论使用哪种循环终止语句, 都只会影响使用终止语句的那一层循环, 而不会干扰到其他层. continue 语句用于循环的例子如代码清单 11 所示.
代码清单 11:continue 语句用于嵌套循环结构
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群: 857662006 寻找有志同道合的小伙伴, 互帮互助,
- 群里还有不错的视频学习教程和 PDF 电子书!
- '''
- # 第 1 层循环, 遍历次数为 2
- for i in range(2):
- print("-----%d-----" %i)
- # 第 2 层循环, 遍历次数为 5
- for j in range(5):
- # 当 j 等于 2 或 4 时, 不执行循环体
- if j == 2 or j == 4:
- continue
- print(j)
输出结果:
- -----0-----
- 0
- 1
- 3
- -----1-----
- 0
- 1
- 3
- 3. pass
pass 是空语句, 不做任何操作, 只起到占位的作用, 其作用是为了保持程序结构的完整性. 尽管 pass 语句不做任何操作, 但如果暂时不确定要在一个位置放上什么样的代码, 可以先放置一个 pass 语句, 让代码可以正常运行. pass 语句并非循环或者条件语句的一部分, 但与 break,continue 在代码形式上有些类似.
使用 pass 语句遍历输出 str 及数值计算, 如代码清单 12 所示.
代码清单 12:pass 语句
- for element in "Python":
- # element 为 y 时, 不做任何操作, 不会被输出
- if element == "y":
- pass
- else:
- print(element)
输出结果:
- P t h o n
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群: 857662006 寻找有志同道合的小伙伴, 互帮互助,
- 群里还有不错的视频学习教程和 PDF 电子书!
- '''
- counts = 0
- while counts < 5:
- counts += 1
- # i=3 时, 不执行循环体
- if counts == 3:
- pass
- else:
- print(counts ** 2)
输出结果:
1 4 16 25
从代码清单 12 可以看到, Python 在 "P" 和 "t" 之间占位, 当循环遍历到 "y" 时不做任何操作; 当 i 等于 3 时, 幂运算不执行, 但不影响其他数值. 上述两个代码如果在 pass 的位置缺失, 程序将无法执行, 因为判断条件没有给出相应的执行语句, 会导致逻辑出错. 使用 pass 语句占位, 一方面为了让程序正常执行, 另一方面也是为了方便以后补充操作语句.
04 列表推导式
推导式是可以从一个数据序列构建另一个新的数据序列的结构体, 能够非常简洁地构造新的变量. 列表推导式是其中最常用的类型.
列表推导式又称为列表解析式, 是 Python 迭代机制的一种应用, 也是一种高效创建列 list 的方式, 可以动态地创建 list. 由于列表推导式必须用到遍历循环, 因此属于一种特殊的循环.
使用列表推导式时, 需要将推导式写在 [] 中. list 中的元素可以来源于其他类型序列, 可迭代对象或自建的满足一定条件的序列. 使用列表推导式的好处是代码更加简洁, 实现效率更高.
列表推导式的基本语法格式如下:
[操作语句 for 变量 in 序列 if 条件表达式]
列表推导式常用的参数及其说明如下所示:
操作语句: 接收操作语句, 表示执行一段代码. 无默认值
条件表达式: 接收布尔表达式, 表示判断条件是否成立. 无默认值
序列: 接收序列, 表示遍历范围. 无默认值
列表推导式可以不包含条件表达式, 只做遍历, 生成 list, 如代码清单 13 所示.
代码清单 13: 使用列表推导式生成 list
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群: 857662006 寻找有志同道合的小伙伴, 互帮互助,
- 群里还有不错的视频学习教程和 PDF 电子书!
- '''
- vec = [-4, -2, 0, 2, 4]
- # 用 vec 中元素的倍数, 创建一个数组
- print([x * 2 for x in vec])
输出结果:
- [-8, -4, 0, 4, 8]
- # 创建一个包含 2 元 tuple 的 list
- print([(x, x ** 2) for x in range(6)])
输出结果:
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
在代码清单 13 中, 除了列表推导式的简单形式, 还说明了列表推导式中可以使用多样的函数和变量类型. 另外, 列表推导式中也可以包含条件语句, 如代码清单 14 所示.
代码清单 14: 包含条件语句的列表推导式
- # 过滤 list, 删除 list 中的负数
- print([x for x in vec if x>= 0])
输出结果:
[0, 2, 4]
列表推导式最大的优点还是简洁, 这需要与常规的编程方式进行对比. 如代码清单 15 所示, 要创建一个平方数组成的 list, 这里的两种方式是等价的, 但列表推导式的方式显然代码更加简洁.
代码清单 15: 常规方式与列表推导式对比
- '''
- 遇到问题没人解答? 小编创建了一个 Python 学习交流 QQ 群: 857662006 寻找有志同道合的小伙伴, 互帮互助,
- 群里还有不错的视频学习教程和 PDF 电子书!
- '''
- # 创建一个平方数 list: 常规方式
- squares = []
- for x in range(10):
- squares.append(x ** 2)
- print(squares)
输出结果:
- [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
- # 创建一个平方数 list 列表推导式
- squares = [x ** 2 for x in range(10)]
- print(squares)
输出结果:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
列表推导式中同样可以实现嵌套循环, 如代码清单 16 所示.
代码清单 16: 包含嵌套循环的列表推导式
- # 打印由 tuple 组成的 list,tuple 中 i 由 0 至 2,j 由 0 至 2
- [(i, j) for i in range(0, 3) for j in range(0, 3)]
输出结果:
- [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
- # 打印由 tuple 组成的 list,i 在 0 至 2 之间且小于 1,j 在 0 至 2 之间且大于 1
- [(i, j) for i in range(0, 3) if i <1 for j in range(0, 3) if j> 1]
输出结果:
[(0, 2)]
代码清单 16 所示的列表推导式将两个不同 list 中的元素整合到了一起. 列表推导式中包含一对括号, 在括号中有一个表达式, 表达式后面紧跟一条 for 语句, 然后是零条或多条 for 语句或 if 语句. 通过 for 语句和 if 语句计算出表达式, 结果作为新 list 的元素.
来源: http://www.bubuko.com/infodetail-3209298.html