def __iter__(self):
return self
Run Code Online (Sandbox Code Playgroud)
只是想知道上面的代码通常做了什么,为什么需要它.
我经历了许多代码教程和块,没有任何适当的规范得到多个答案,只是一个简短的解释将是伟大的.
编辑:对于 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)
这有点令人困惑。简而言之,定义 __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)