在__iter__方法中返回self的用途是什么?

Smp*_*e_V 6 python python-2.7

def __iter__(self):
    return self 
Run Code Online (Sandbox Code Playgroud)

只是想知道上面的代码通常做了什么,为什么需要它.

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

bvm*_*ode 9

编辑:对于 2.7 而不是 3

这是我的理解

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

iterable = 一个可以迭代的对象...实现 __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
Run Code Online (Sandbox Code Playgroud)


use*_*332 6

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

回想一下,迭代器是一个具有 next 方法的对象,目的是在执行迭代的过程中返回下一个项目。调用 next 方法后,迭代器的状态发生变化。

回想一下,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()
Run Code Online (Sandbox Code Playgroud)

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

for i in OneToFourIterable():
  print i
Run Code Online (Sandbox Code Playgroud)

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

iterator = OneToFourIterator()
while True:
  try:
    current = iterator.next()
    print current
  except StopIteration:
    break
Run Code Online (Sandbox Code Playgroud)

最后,我认为人们为什么定义 __iter__ 来返回 self 的答案是,不是像上面那样编写 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
Run Code Online (Sandbox Code Playgroud)

  • 为了可迭代,由 __iter__``` 返回的对象必须定义一个 ``__next__``` 方法。这就是迭代器类在 ``__iter__``` 中返回 self 的原因。这是因为该类定义了``__next__``` (2认同)