Python核心技术——循环与迭代是编程的基本功
- 编程
- 2023-01-23
循环语句
循环语句本质上就是遍历集合中的元素。和其他语言一样,Python 中的循环主要有 for 循环和 while 循环。前者用于执行逻辑循环;后者偏向对象内容迭代
比如,我们有一个列表,需要遍历列表中的所有元素并打印输出,代码如下:
l = [1, 2, 3, 4]
# 从可迭代对象中依次获取元素
for item in l:
print(item)
1
2
3
4
很多时候,for 循环和 while 循环可以互相转换,比如要遍历一个列表,我们用 while 循环同样可以完成:
l = [1, 2, 3, 4]
# 基于特定条件,循环执行命令
length=len(l)
while length>0:
print(l[4-length])
length-=1
是不是很简单呢?其实,Python 中的数据结构只要是可迭代的(iterable),比如列表、元组、集合等等,对列表的遍历如下:
for a,b in [(1,2),(3,4)]:
print(a,b)
1 2
3 4
注意:字典本身只有键是可迭代的,如果我们要遍历它的值或者是键值对,就需要通过其内置的函数 values() 或者 items() 实现。其中,values() 返回字典的值的集合,items() 返回键值对的集合。
遍历字典的键
d = {name: 小码农和农夫, date: 2023-01-13, gender: 男}
for k in d:
print(k)
name
date
gender
遍历字典的值
for v in d.values():
print(v)
小码农和农夫
2023-01-13
男
遍历字典的键值对
d = {name: 小码农和农夫, date: 2023-01-13, gender: 男}
for k,v in d.items():
print(key: {}, value: {}.format(k, v))
key: name, value: 小码农和农夫
key: date, value: 2023-01-13
key: gender, value: 男
你也许会问,有没有办法通过集合中的索引来遍历元素呢?当然可以,其实这种情况在实际工作中还是很常见的,甚至很多时候,我们还得根据索引来做一些条件判断。
我们通常通过 range() 这个函数,拿到索引,再去遍历访问集合中的元素。比如下面的代码,遍历一个列表中的元素,当索引大于 5 时,打印输出:
l = [1, 2, 3, 4, 5, 6, 7]
for index in range(0, len(l)):
if index > 5:
print(l[index]
7
enumerate()
当需要同时索引和元素时,采用上面的方式会复杂一下。Python中内置了一个函数 enumerate(),用它来遍历集合,不仅返回每个元素,并且还返回其对应的索引。
l = [1, 2, 3, 4, 5, 6, 7]
for index,item in enumerate(l):
if index > 5:
print(key: {}, value: {}.format(index, item))
key: 6, value: 7
continue 和 break在循环语句的使用
continue,就是让程序跳过当前这层循环,继续执行下面的循环;break 则是指完全跳出所在的整个循环体。比如,给定两个字典,分别是产品名称到价格的映射,和产品名称到颜色列表的映射。我们要找出价格小于 10,并且颜色不是红色的所有产品名称和颜色的组合。如果不用 continue,代码应该是下面这样的:
# name_price: 产品名称 (str) 到价格 (int) 的映射字典
# name_color: 产品名字 (str) 到颜色 (list of str) 的映射字典
name_price={A:10,B:9,"C":11}
name_color={A:红,B:"黄","C":"蓝"}
for name, price in name_price.items():
if price < 10:
if name in name_color:
for color in name_color[name]:
if color != 红:
(name: {}, color: {}.format(name, color))
else:
print(name: {}, color: {}.format(name, None))
name: B, color: 黄
而加入 continue 后,代码显然清晰了很多:
# name_price: 产品名称 (str) 到价格 (int) 的映射字典
# name_color: 产品名字 (str) 到颜色 (list of str) 的映射字典
name_price={A:10,B:9,"C":11}
name_color={A:红,B:"黄","C":"蓝"}
for name, price in name_price.items():
if price >= 10:
continue
if name not in name_color:
print(name: {}, color: {}.format(name, None))
continue
for color in name_color[name]:
if color == 红:
continue
print(name: {}, color: {}.format(name, color))
name: B, color: 黄
我们可以看到,按照第一个版本的写法,从开始一直到打印输出符合条件的产品名称和颜色,共有 5 层 for 或者 if 的嵌套;但第二个版本加入了 continue 后,只有 3 层嵌套。
显然,如果代码中出现嵌套里还有嵌套的情况,代码便会变得非常冗余、难读,也不利于后续的调试、修改。因此,我们要尽量避免这种多层嵌套的情况。
小结
在 for 循环中,如果需要同时访问索引和元素,你可以使用 enumerate() 函数来简化代码。写条件与循环时,合理利用 continue 或者 break 来避免复杂的嵌套,是十分重要的。Python核心技术系列
Python核心技术——重新定义列表和元组
Python核心技术——重新认识字典和集合
Python核心技术——重新认识字符串
Python核心技术——JSON 序列化与实战
Python核心技术——输入和输出的秘密
Python核心技术——条件分支控制流
Python核心技术——异常处理与实战