迭代(iteration)
逐个获取元素的过程,就是「迭代」。
例如:
# iteration
# 用 for 循环迭代序列
a_list = [1, 2, 3]
for i in a_list:
print(i)
可迭代(iterable)
实现了方法 __iter__ 的对象是可迭代的。
如果你暂时听不懂,那可以简单地理解为:如果我们可以从一个对象中逐个地获取元素,那么我们就说这个对象是「可迭代」的。
Python 中的顺序类型,都是可迭代的,例如 list、 tuple,、string;另外 dict、set、 file 也是可迭代的。
迭代器(iterator)
实现了方法 __next__ 的对象是迭代器。
当你调用方法 __next__ (可不提供任何参数)时,迭代器应返回下一个值。如果迭代器没有可供返回的值,应引发 StopIteration 异常。
你还可使用内置的便利函数 next,在这种情况下,next(it) 与 it.__next__() 等效。
迭代器协议(iterator protocol)
迭代器协议指的是容器类需要包含一个特殊方法,这个特殊方法就是 __iter__() 方法。
如果一个容器类提供了 __iter__() 方法,并且该方法能返回一个能够逐个访问容器内所有元素的迭代器,则我们说该容器类实现了迭代器协议。
迭代器协议与 for 循环
讲这个例子,是为了更好地理解迭代器协议。
# iterator protocol and for loop
for x in something:
print(x)
Python 处理 for 循环时,首先会调用 something.__iter__(),返回 something 对应的迭代器(假设叫 it);而后,for 循环会调用 it.__next__(),获取迭代器的下一个元素,并赋值给 x,然后执行循环体;执行完后,for 循环会继续调用 it.__next__(),获取迭代器的下一个元素,并赋值给 x,执行循环体 …… 当 for 循环调用 it.__next__()产生 StopIteration 异常时,循环结束。
咱们可以用下面的代码模拟一下:
>>> a_list = [1,2,3,4]
>>> it = a_list.__iter__() # 获取迭代器
>>> it.__next__() # 让迭代器返回下一个值
1
>>> it.__next__()
2
>>> it.__next__()
3
>>> it.__next__()
4
>>> it.__next__() # 迭代器没有可供返回的值,引发 StopIteration 异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
参考资料
【1】《Python基础教程》(人民邮电出版社,第3版)
本文深入解析了迭代(iteration)、可迭代(iterable)、迭代器(iterator)和迭代器协议(iterator protocol)的概念,通过Python代码示例展示了如何实现迭代器协议,并解释了其与for循环之间的关系。
1428

被折叠的 条评论
为什么被折叠?



