循环语句
循环语句本质上就是遍历集合中的元素。和其他语言一样,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 >
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核心技术——异常处理与实战
领取专属 10元无门槛券
私享最新 技术干货