尽管阅读起来就可以了,我还是不太明白如何 __iter__ 工程。什么会是一个简单的解释?

我已经看到了 def__iter__(self): return self.我怎么没看到这个工程或步骤如何运作的。

有帮助吗?

解决方案

一个迭代的需要界定两种方法: __iter__()__next__() (next() 在python2).通常,对象本身的定义 __next__()next() 方法,所以刚刚返回自己的迭代器。这将创建一个 可迭代 这本身也是一个 迭代.这些方法的使用 forin 发言。

其他提示

就像我可以说的那样:

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

__ iter __()返回的迭代器对象几乎可以是任何对象,只要它定义 next()方法。

next 方法将由 for ... in ... 之类的语句调用以产生下一个项目, next()当没有更多项目时,应该引发 StopIteration 异常。

有什么好处是让定义对象的迭代方式, __ iter __ 提供了一个通用接口,每个其他python函数都知道如何使用。

def __iter __(self):的规范是:它返回一个迭代器。因此,如果 self 是一个迭代器, return self 显然是合适的。

“作为迭代器”表示“具有 __ next __(self)方法” (在Python 3中;在Python 2中,有问题的方法的名称很遗憾是普通的 next ,显然是特殊方法的名称设计故障)。

在Python 2.6及更高版本中,实现迭代器的最佳方法通常是使用 collections 标准库 module - 在Python 2.6中,代码可能是(记得调用方法 __ next __ 而不是Python 3):

import collections

class infinite23s(collections.Iterator):
  def next(self): return 23

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

支持__iter__方法的类将返回一个迭代器对象实例:一个支持 next()方法的对象。该对象将在“for for”的陈述中可用。和“in”。

在Python中,迭代器是支持迭代器协议的任何对象。该协议的一部分是该对象必须具有返回迭代器对象的 __ iter __()方法。我想这给了你一些灵活性,以便一个对象可以将迭代器的职责传递给内部类,或者创建一些特殊的对象。在任何情况下, __ iter __()方法通常只有一行,而该行通常只是 return self

协议的另一部分是 next()方法,这是真正的工作完成的地方。此方法必须弄清楚或创建或获取下一个东西,并将其返回。它可能需要跟踪它的位置,以便下次调用时,它确实会返回下一个。

一旦你有一个返回序列中下一个东西的对象,你可以折叠一个如下所示的for循环:

myname = "Fredericus"
x = []
for i in [1,2,3,4,5,6,7,8,9,10]:
   x.append(myname[i-1])
   i = i + 1 # get the next i
print x

进入这个:

myname = "Fredericus"
x = [myname[i] for i in range(10)]
print x

请注意,我们无法获得获取i的下一个值的代码,因为range(10)是一个跟随迭代器协议的对象,而list comprehension是一个使用迭代器协议的构造。

您也可以直接使用迭代器协议。例如,在编写脚本来处理CSV文件时,我经常写这个:

mydata = csv.reader(open('stuff.csv')
mydata.next()
for row in mydata:
    # do something with the row.

我通过调用 next()直接使用迭代器跳过标题行,然后通过中的运算符中的builtin 间接使用它/ code>声明。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top