本篇我们介绍 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() 函数,它会返回一个相同的迭代器。
我们会在后续课程中介绍如何创建可迭代对象。