繁体   English   中英

__iter__如何工作?

[英]How does __iter__ work?

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

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

就像我可以说的那样:

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

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

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

它的优点在于它允许定义对象的迭代方式,而__iter__提供了一个通用接口,每个其他python函数都知道如何使用它。

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

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__方法的类将返回迭代器对象实例:支持next()方法的对象。 该对象将在“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()直接使用迭代器跳过标题行,然后通过for语句中的builtin in运算符间接使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM