Python 迭代器是否正式需要 __iter__ 方法?

Dea*_*itz 5 python iterator

一些地方在网上,其中包括堆栈溢出的答案(如这个这个这个),提到了Python迭代器必须实现的__next__方法(我的理解)__iter__方法。这些地方正确地得出结论,所有迭代器也是可迭代的。如果注释为 a 的变量typing.Iterator未实现该__iter__方法,则即使 PyCharm 也会发出类型警告。

与这些相反,关于迭代器官方 Python 教程部分只提到需要一个__next__方法:

该函数返回一个迭代器对象,该对象定义了__next__()一次访问容器中元素的方法

所以我的问题是:Python 迭代器是否正式需要自己成为可迭代对象?我个人不明白为什么这应该是真的,以及为什么我们不能完全分离 anIterable和 an的要求Iterator

use*_*ica 4

这就是教程。它掩盖了事情。如果您检查数据模型文档,您将看到迭代器支持的明确要求__iter__

迭代器对象本身需要支持以下两种方法,它们共同构成了迭代器协议

iterator.__iter__()

返回迭代器对象本身。这是允许容器和迭代器与 for 和 in 语句一起使用所必需的。该方法对应于Python/C API中Python对象类型结构的tp_iter槽。

iterator.__next__()

...

Python 很容易设计为使迭代器不可迭代,就像 Java 所做的那样,但这会适得其反。迭代器的迭代在 Python 中非常常见和标准,而且它始终是这样的。

必须在每个循环中添加某种iterwrapper围绕迭代器for就像addablewrapper每次要添加两个整数时都必须在整数周围添加某种形式一样。