__iter__ 是如何工作的?
尽管我查阅了很多资料,但我还是不太明白 __iter__
是怎么回事。能不能简单解释一下?
我见过这样的写法:def __iter__(self): return self
。我不太明白这是什么意思,也不知道它是怎么工作的。
5 个回答
关于 def __iter__(self):
的说明是:它会返回一个迭代器。所以,如果 self
本身就是一个迭代器,那么 return self
当然是合适的选择。
所谓“是一个迭代器”,就是指它有一个 __next__(self)
方法(在 Python 3 中;在 Python 2 中,这个方法的名字就叫 next
,这个命名确实有点问题,因为它是个特殊方法)。
在 Python 2.6 及更高版本中,创建迭代器的最佳方法通常是使用 collections
标准库中的合适抽象基类,具体可以参考 这个模块。在 Python 2.6 中,代码可能是这样的(记得在 Python 3 中调用的方法是 __next__
):
import collections
class infinite23s(collections.Iterator):
def next(self): return 23
这个类的实例在被迭代时会无限次返回 23
的副本(就像 itertools.repeat(23)
一样),所以循环必须在某个地方终止。重点是,继承 collections.Iterator
会自动为你添加合适的 __iter__
方法——这并不是特别复杂,但这是一个好的通用原则(避免重复的、冗长的代码,比如迭代器的标准一行 __iter__
方法——重复没有附加价值,反而会减少价值!)。
简单来说:
__iter__
是一个在类里定义的方法,它会返回一个迭代器(就是一个能一个接一个地给出你对象里面下一个项目的东西)。
__iter__()
返回的迭代器可以是任何对象,只要它里面有一个 next()
方法。
next
方法会被像 for ... in ...
这样的语句调用,用来获取下一个项目,当没有更多项目时,next()
应该抛出 StopIteration
异常。
这点很棒,因为它让 你 可以定义你的对象是怎么被迭代的,而 __iter__
提供了一个大家都能理解的通用接口,所有其他的 Python 函数都知道怎么使用它。
一个迭代器需要定义两个方法:__iter__()
和 __next__()
(在Python 2中是next()
)。通常情况下,那个对象自己会定义__next__()
或者next()
方法,这样它就可以直接返回自己作为迭代器。这样就创建了一个既可以被迭代又是迭代器的对象。这些方法会被for
和in
语句使用。