尽管阅读了它,我仍然不太明白它是如何__iter__工作的.什么是简单的解释?
我见过def__iter__(self): return self.我不知道这是如何工作的或步骤如何工作.
Gab*_*ley 24
就像我可以说的那样:
__iter__ 在类上定义一个方法,该方法将返回一个迭代器(一个连续产生对象包含的下一个项的对象).
__iter__()返回的迭代器对象几乎可以是任何对象,只要它定义了一个next()方法即可.
该next方法将由类似于for ... in ...生成下一个项的语句调用,并且next()应该在StopIteration没有更多项时引发异常.
这很棒的是它允许您定义对象的迭代方式,并__iter__提供一个通用接口,每个其他python函数都知道如何使用它.
迭代器需要定义两个方法:__iter__()和__next__()(next()在python2中).通常,对象本身定义__next__()或next()方法,因此它只返回迭代器.这创建了一个迭代,它本身也是一个迭代器.这些方法由for和in语句使用.
Python 3文档:docs.python.org/3/library/stdtypes.html#iterator-types
Python 2文档:docs.python.org/2/library/stdtypes.html#iterator-types
规范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__- 重复,没有附加价值和很多减去价值! - ).