__iter__如何工作?

sss*_*sss 20 python iterator

尽管阅读了它,我仍然不太明白它是如何__iter__工作的.什么是简单的解释?

我见过def__iter__(self): return self.我不知道这是如何工作的或步骤如何工作.

Gab*_*ley 24

就像我可以说的那样:

__iter__ 在类上定义一个方法,该方法将返回一个迭代器(一个连续产生对象包含的下一个项的对象).

__iter__()返回的迭代器对象几乎可以是任何对象,只要它定义了一个next()方法即可.

next方法将由类似于for ... in ...生成下一个项的语句调用,并且next()应该在StopIteration没有更多项时引发异常.

这很棒的是它允许定义对象的迭代方式,并__iter__提供一个通用接口,每个其他python函数都知道如何使用它.


has*_*sen 8

迭代器需要定义两个方法:__iter__()__next__()(next()在python2中).通常,对象本身定义__next__()next()方法,因此它只返回迭代器.这创建了一个迭代,它本身也是一个迭代器.这些方法由forin语句使用.

  • 在Python 3中成为`__next __()`而不是`next()`. (4认同)
  • 这令人困惑.特别是因为你说了些什么,然后马上说这是谎言.大声笑,只是更新它是正确的 (3认同)

Ale*_*lli 5

规范def __iter__(self):是:它返回一个迭代器.所以,如果self是迭代器,return self显然是合适的.

"作为一个迭代器"意味着"有一个__next__(self)方法"(在Python 3中;在Python 2中,有问题的方法的名称很遗憾next,显然是特殊方法的名称设计故障).

在Python 2.6及更高版本中,实现迭代器的最佳方法通常是使用collections标准库模块中的相应抽象基类- 在Python 2.6中,代码可能是(记得__next__在Python 3中调用该方法):

import collections

class infinite23s(collections.Iterator):
  def next(self): return 23
Run Code Online (Sandbox Code Playgroud)

23迭代时(例如itertools.repeat(23))此类的实例将返回无限多个副本,因此必须以其他方式终止循环.关键是子类化代表你collections.Iterator添加正确的__iter__方法 - 这里没什么大不了的,但是一个很好的一般原则(避免重复的样板代码,如迭代器的标准单行__iter__- 重复,没有附加价值和很多减去价值! - ).