Python 频繁地使用迭代器。它允许在数据结构长度未知和具体实现未知的情况下遍历整个数据结构,并且支持迭代快速读写中的数据,以及允许不能一次读入计算机内存的数据流的处理。
(比如有一桶饭在面前,迭代就相当于一口一口吃饭,而非迭代相当于一口吃一桶)
# 下面这一遍历序列的方法是可行的:
>>> rabbits = ['Flopsy', 'Mopsy', 'Cottontail', 'Peter']
>>> current = 0
>>> while current < len(rabbits):
... print(rabbits[current])
... current += 1
...
Flopsy
Mopsy
Cottontail
Peter
# 但是,有一种更优雅的、Python 风格的遍历方式:
>>> for rabbit in rabbits:
... print(rabbit)
...
Flopsy
Mopsy
Cottontail
Peter
列表(例如 rabbits)、字符串、元组、字典、集合等都是Python 中可迭代的对象。元组或者列表在一次迭代过程产生一项,而字符串迭代会产生一个字符,如下所示:
>>> word = 'cat'
>>> for letter in word:
... print(letter)
...
c
a
t
对一个字典(或者字典的 keys() 函数)进行迭代将返回字典中的键。在下面的例子中,字
典的键为图板游戏 Clue(《妙探寻凶》)中牌的类型:
>>> accusation = {'room': 'ballroom', 'weapon':'lead pipe',
'person': 'Col. Mustard'}
>>> for card in accusation: # 或者是for card in accusation.keys():
... print(card)
...
room
weapon
person
使用break跳出循环
在 for 循环中跳出的用法和在 while 循环中是一样的。
使用continue跳到循环开始
在一个循环中使用 continue 会跳到下一次的迭代开始,这一点和 while 循环也是类似的。
循环外使用else
类似于 while,for 循环也可以使用可选的 else 代码段,用来判断 for 循环是否正常结束(没有调用 break 跳出),否则会执行 else 段。
当你想确认之前的 for 循环是否正常跑完,增加 else 判断是有用的。
使用zip()并行迭代
在使用迭代时,有一个非常方便的技巧:通过 zip() 函数对多个序列进行并行迭代
days = ['Monday', 'Tuesday', 'Wednesday']
fruits = ['banana', 'apple', 'orange']
drinks = ['a', 'b', 'c', 'd']
for day, drink, fruit in zip(days, drinks, fruits):
print(day, 'drink', drink, 'eat', fruit)
Monday drink a eat banana
Tuesday drink b eat apple
Wednesday drink c eat orange
zip() 函数在最短序列“用完”时就会停止。上面例子中的列表(desserts)是最长的,所以我们无法填充列表,除非人工扩展其他列表。
dict() 函数会将两项序列,比如元组、列表、字符串,创建成
一个字典,同时使用 zip() 函数可以遍历多个序列,在具有相同位移的项之间创建元组。
下面创建英语单词和法语单词之间的对应关系的两个元组:
>>> english = 'Monday', 'Tuesday', 'Wednesday'
>>> french = 'Lundi', 'Mardi', 'Mercredi'
现在使用 zip() 函数配对两个元组。函数的返回值既不是元组也不是列表,而是一个整合在一起的可迭代变量:
>>> print(zip(english, french))
<zip object at 0x0000014EA704FCC8>
>>> list( zip(english, french) )
[('Monday', 'Lundi'), ('Tuesday', 'Mardi'), ('Wednesday', 'Mercredi')]
配合 dict() 函数和 zip() 函数的返回值就可以得到一本微型的英法词典:
>>> dict( zip(english, french) )
{'Monday': 'Lundi', 'Tuesday': 'Mardi', 'Wednesday': 'Mercredi'}
使用range()生成自然数序列
range() 函数的用法类似于使用切片:range(start、stop、step)。而 start 的默认值为0。唯一要求的参数值是 stop,顾头不顾尾,并且 step 的默认值是 1。当然,也可以反向创建自然数序列,这时 step 的值为 -1。
>>> for x in range(0,3):
... print(x)
...
0
1
2
>>> list( range(0, 3) )
[0, 1, 2]
下面是如何从 2 到 0 反向创建序列:
>>> for x in range(2, -1, -1):
... print(x)
...
2
1
0
>>> list( range(2, -1, -1) )
[2, 1, 0]
下面的代码片段将 step 赋值为 2,得到从 0 到 10 的偶数:
>>> list( range(0, 11, 2) )
[0, 2, 4, 6, 8, 10]