一些地方在网上,其中包括堆栈溢出的答案(如这个,这个和这个),提到了Python迭代器必须实现的__next__
方法(我的理解)和该__iter__
方法。这些地方正确地得出结论,所有迭代器也是可迭代的。如果注释为 a 的变量typing.Iterator
未实现该__iter__
方法,则即使 PyCharm 也会发出类型警告。
与这些相反,关于迭代器的官方 Python 教程部分只提到需要一个__next__
方法:
该函数返回一个迭代器对象,该对象定义了
__next__()
一次访问容器中元素的方法
所以我的问题是:Python 迭代器是否正式需要自己成为可迭代对象?我个人不明白为什么这应该是真的,以及为什么我们不能完全分离 anIterable
和 an的要求Iterator
。
这就是教程。它掩盖了事情。如果您检查数据模型文档,您将看到迭代器支持的明确要求__iter__
:
迭代器对象本身需要支持以下两种方法,它们共同构成了迭代器协议:
iterator.__iter__()
返回迭代器对象本身。这是允许容器和迭代器与 for 和 in 语句一起使用所必需的。该方法对应于Python/C API中Python对象类型结构的tp_iter槽。
iterator.__next__()
...
Python 很容易被设计为使迭代器不可迭代,就像 Java 所做的那样,但这会适得其反。迭代器的迭代在 Python 中非常常见和标准,而且它始终是这样的。
必须在每个循环中添加某种iterwrapper
围绕迭代器for
就像addablewrapper
每次要添加两个整数时都必须在整数周围添加某种形式一样。