Python学习之迭代器协议

文章目录

    • 迭代(iteration)
    • 可迭代(iterable)
    • 迭代器(iterator)
    • 迭代器协议(iterator protocol)
    • 迭代器协议与 for 循环



迭代(iteration)

逐个获取元素的过程,就是「迭代」。

例如:

# iteration
# 用 for 循环迭代序列
a_list = [1, 2, 3]
for i in a_list:
    print(i)

可迭代(iterable)

实现了方法 __iter__ 的对象是可迭代的。

如果你暂时听不懂,那可以简单地理解为:如果我们可以从一个对象中逐个地获取元素,那么我们就说这个对象是「可迭代」的。

Python 中的顺序类型,都是可迭代的,例如 listtuple,、string;另外 dictsetfile 也是可迭代的。

迭代器(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 "", line 1, in <module>
StopIteration
>>> 






参考资料

【1】《Python基础教程》(人民邮电出版社,第3版)

【2】 Python 中的黑暗角落(一):理解 yield 关键字

你可能感兴趣的:(python)