Python核心技术——循环与迭代是编程的基本功

循环语句

循环语句本质上就是遍历集合中的元素。和其他语言一样,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核心技术——异常处理与实战