本篇我们介绍 Python 中的可遍历对象(iterable)与迭代器(iterator),以及它们之间的区别。
可遍历对象
在 Python 中,可遍历对象是指包含零个、一个或者多个元素的对象。
可遍历对象支持一次返回一个元素,因此我们可以使用 for 循环遍历这类对象。
实际上,range() 函数就是一个可遍历的对象,因为我们可以遍历它的结果:
for index in range(3):
print(index)
输出结果如下:
0
1
2
同理,字符串也是一种可遍历对象,因为我们可以使用 for 循环遍历字符串:
str = 'Iterables'
for ch in str:
print(ch)
列表和元组也都是可遍历的对象,我们可以对它们进行遍历。例如:
ranks = ['high', 'medium', 'low']
for rank in ranks:
print(rank)
原则就是,如果某种对象可以遍历,它就是可遍历对象。
迭代器
可遍历对象可以进行迭代,迭代器(iterator)就是执行迭代操作时的代理对象。
如果想要获取可遍历对象的迭代器,可以使用 iter() 函数。例如:
colors = ['red', 'green', 'blue']
colors_iter = iter(colors)
一旦我们获得了迭代器,就可以利用 next() 函数获取可遍历对象中的下一个元素:
colors = ['red', 'green', 'blue']
colors_iter = iter(colors)
color = next(colors_iter)
print(color)
输出结果如下:
red
每次调用 next() 函数都会返回可遍历对象的下一个元素。例如:
colors = ['red', 'green', 'blue']
colors_iter = iter(colors)
color = next(colors_iter)
print(color)
color = next(colors_iter)
print(color)
color = next(colors_iter)
print(color)
输出结果如下:
red
green
blue
如果遍历完所有元素之后,再次调用 next() 函数,将会返回一个异常。
colors = ['red', 'green', 'blue']
colors_iter = iter(colors)
color = next(colors_iter)
print(color)
color = next(colors_iter)
print(color)
color = next(colors_iter)
print(color)
# 返回异常
color = next(colors_iter)
print(color)
以上示例首先会返回 colors 列表中的三个元素,然后抛出一个异常:
red
green
blue
Traceback (most recent call last):
File "iterable.py", line 15, in <module>
color = next(colors_iter)
StopIteration
迭代器是有状态的,意味着一旦我们使用了迭代器中的元素,它就不再存在。也就是说,一旦我们遍历完整个迭代器,它就会变成一个空的迭代器。如果我们再次遍历这个迭代器,它不会返回任何内容。
由于我们可以遍历迭代器,因此迭代器也是一种可遍历对象。这一点比较令人困惑。例如:
colors = ['red', 'green', 'blue']
iterator = iter(colors)
for color in iterator:
print(color)
输出结果如下:
red
green
blue
如果我们使用一个迭代器作为参数调用 iter() 函数,它会返回一个相同的迭代器。
我们会在后续课程中介绍如何创建可迭代对象。
总结
- 可遍历对象(iterable)是一种可以进行遍历的对象,它可以一次返回一个元素。
- 迭代器(iterator)是执行迭代操作时的代理对象。迭代器拥有状态,它也是一种可遍历对象。
- 使用 iter() 函数获取可遍历对象的迭代器,使用 next() 函数获取可迭代对象中的下一个元素。