def __iter__(self):
return self
只是想知道上面的代码通常做什么,为什么它是必需的。在__iter__方法中返回self的用法是什么?
我经历了许多代码教程和块,得到多个答案没有任何适当的规范,只是一个简短的解释将是伟大的。
def __iter__(self):
return self
只是想知道上面的代码通常做什么,为什么它是必需的。在__iter__方法中返回self的用法是什么?
我经历了许多代码教程和块,得到多个答案没有任何适当的规范,只是一个简短的解释将是伟大的。
编辑: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
这有点令人困惑。简而言之,将__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
这也让我困惑的一点时间:) 好,让我们看到一个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类
的可能的复制[如何使类迭代?(http://stackoverflow.com/questions/19151/how-to -make-class-iterable) – vaultah
@vaultah ya它来自可迭代代码部分,我已经在其他许多方法中看到了这个部分,所以我只是想知道为什么我们通常使用这部分代码 –
你是什么意思?您是否阅读过链接页面上的答案? *“__iter__'返回迭代器对象,并在循环开始时隐式调用。”*是您的问题的答案。 – vaultah