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 中的顺序类型,都是可迭代的,例如 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版)
【2】 Python 中的黑暗角落(一):理解 yield 关键字
总结
以上是生活随笔为你收集整理的Python学习之迭代器协议的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 新发现
- 下一篇: python queue的用法_pyth