2016-02-26 75 views
4
def __iter__(self): 
    return self 

只是想知道上面的代码通常做什么,为什么它是必需的。在__iter__方法中返回self的用法是什么?

我经历了许多代码教程和块,得到多个答案没有任何适当的规范,只是一个简短的解释将是伟大的。

+1

的可能的复制[如何使类迭代?(http://stackoverflow.com/questions/19151/how-to -make-class-iterable) – vaultah

+1

@vaultah ya它来自可迭代代码部分,我已经在其他许多方法中看到了这个部分,所以我只是想知道为什么我们通常使用这部分代码 –

+0

你是什么意思?您是否阅读过链接页面上的答案? *“__iter__'返回迭代器对象,并在循环开始时隐式调用。”*是您的问题的答案。 – vaultah

回答

3

编辑:2.7,而不是3

这是我的理解

在下面的示例代码,我们可以说,类测试是一个迭代的对象,因为我们与__iter__付诸实施。方法__iter__返回一个迭代器。迭代器使用下一个方法来确定迭代中的下一个值。如果我要从下面的类中删除next方法,代码将失败。

迭代=定义如何循环......从字面上可以遍历的对象......与__iter__

迭代器实现的=对象,什么是下一个值。这是用__next__

因此,你质疑的代码片段实际上需要类对象(self是参数)并返回一个迭代器,这使得类对象可迭代。所以在下面的例子中,我们实际上可以遍历类对象myObj。

class Testing: 
    def __init__(self,a,b): 
     self.a = a 
     self.b = b 
    def __iter__ (self): 
     return self 
    def next(self): 
     if self.a <= self.b: 
      self.a += 1 
      return self.a-1 
     else: 
      raise StopIteration 

myObj = Testing(1,5)   
for i in myObj: 
    print i 
1

这有点令人困惑。简而言之,将__iter__定义为返回自身基本上是将迭代器对象快速转换为迭代器,以便您可以在for循环中使用它。

回想一下,迭代器是带有下一个方法的对象,用于返回执行迭代过程中的下一个项目。在调用下一个方法之后,迭代器的状态会改变。

回想一下,iterable是带有__iter__方法的对象,其目的是返回一个新的迭代器来执行迭代。

要分开的概念,让我们的迭代器OneToFourIterator和例子可迭代OneToFourIterable

class OneToFourIterator: 
    def __init__(self): 
    self.state = 0 
    def next(self): 
    self.state += 1 
    if self.state > 4: 
     raise StopIteration 
    return self.state 

class OneToFourIterable: 
    def __init__(self): 
    pass 
    def __iter__(self): 
    return OneToFourIterator() 

要执行使用for循环,你必须给它这样一个可迭代的迭代中,

for i in OneToFourIterable(): 
    print i 

如果在for循环中使用迭代器,它会给出错误。要使用迭代的迭代器,你会做这样的事情

iterator = OneToFourIterator() 
while True: 
    try: 
    current = iterator.next() 
    print current 
    except StopIteration: 
    break 

最后,我想答案,为什么人们定义__iter__回归自我,是不是写像上述2类,您可以快速打开一个迭代到迭代,这样就可以使用它在一个for循环:

class OneToFourIteratorAndIterable: 
    def __init__(self): 
    self.state = 0 
    def next(self): 
    self.state += 1 
    if self.state > 4: 
     raise StopIteration 
    return self.state 
    pass 
    def __iter__(self): 
    return self 

for i in OneToFourIteratorAndIterable(): 
    print i 
0

这也让我困惑的一点时间:) 好,让我们看到一个for循环中的Python:

for i in a: 
    print i 

在这段代码中,for循环将隐含地调用一个。更重要的是,在python中,如果你想要一个迭代器,那么这个类必须实现'iterator'接口,这意味着它应该有_____和___下___,并且__iter__的效果会返回一个迭代器。

但是,python中还有另一个概念,它调用iterable,它是一个可以制造迭代器的工厂。

好了,现在,我们要的是可以ITER要么迭代或迭代,所以,他们的ITER方法必须返回一个迭代器。

对于可迭代,它应该返回一个迭代器(可能是另一个类实现的'iterator'接口),对于迭代器来说,是的,它本身就是一个迭代器,所以只需返回它自己!

下面的代码片段是流利的Python副本:

import reprlib 

RE_WORD = re.compile('\w+') 


class Sentence: 
    def __init__(self, text): 
     self.text = text 
     self.words = RE_WORD.findall(text) 

    def __repr__(self): 
     return 'Sentence(%s)' % reprlib.repr(self.text) 

    def __iter__(self): 
     return SentenceIterator(self.words) 


class SentenceIterator: 
    def __init__(self, words): 
     self.words = words 
     self.index = 0 

    def __next__(self): 
     try: 
      word = self.words[self.index] 
     except IndexError: 
      raise StopIteration() 
     self.index += 1 
     return word 

    def __iter__(self): 
     return self 
s = Sentence('"The time has come," the Walrus said,') 

,你可以这样做:

for i in iter(s): 
     print(s) 

和:

for i in s: 
     print(s) 

如果删除__iter__in迭代器,你只能使用:

for i in s: 
    print(s) 

由于国际热核实验堆(S)不再是一个迭代器,当你删除__iter__in iterator类

相关问题