__iter__ 是如何工作的?

25 投票
5 回答
16787 浏览
提问于 2025-04-15 15:17

尽管我查阅了很多资料,但我还是不太明白 __iter__ 是怎么回事。能不能简单解释一下?

我见过这样的写法:def __iter__(self): return self。我不太明白这是什么意思,也不知道它是怎么工作的。

5 个回答

6

关于 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__ 方法——重复没有附加价值,反而会减少价值!)。

29

简单来说:

__iter__ 是一个在类里定义的方法,它会返回一个迭代器(就是一个能一个接一个地给出你对象里面下一个项目的东西)。

__iter__() 返回的迭代器可以是任何对象,只要它里面有一个 next() 方法。

next 方法会被像 for ... in ... 这样的语句调用,用来获取下一个项目,当没有更多项目时,next() 应该抛出 StopIteration 异常。

这点很棒,因为它让 可以定义你的对象是怎么被迭代的,而 __iter__ 提供了一个大家都能理解的通用接口,所有其他的 Python 函数都知道怎么使用它。

10

一个迭代器需要定义两个方法:__iter__()__next__()(在Python 2中是next())。通常情况下,那个对象自己会定义__next__()或者next()方法,这样它就可以直接返回自己作为迭代器。这样就创建了一个既可以被迭代又是迭代器的对象。这些方法会被forin语句使用。

撰写回答