Python 返回自我在iter方法中有什么用?
只是想知道上面的代码通常做什么,为什么需要它Python 返回自我在iter方法中有什么用?,python,python-2.7,Python,Python 2.7,只是想知道上面的代码通常做什么,为什么需要它 我浏览了很多代码教程和代码块,得到了很多答案,但没有任何适当的说明,只要简单的解释就好了。编辑:对于2.7而不是3 这是我的理解 在下面的示例代码中,我们可以说类测试是一个iterable对象,因为我们使用\uuuuuIter\uuuuuu实现了它。方法返回一个迭代器。迭代器使用next方法来确定迭代中的下一个值。如果我从下面的类中删除next方法,代码将失败 iterable=可以在…上迭代的对象,使用\uuuuu iter\uuuuu 迭代器=定
我浏览了很多代码教程和代码块,得到了很多答案,但没有任何适当的说明,只要简单的解释就好了。编辑:对于2.7而不是3 这是我的理解 在下面的示例代码中,我们可以说类测试是一个iterable对象,因为我们使用
\uuuuuIter\uuuuuu
实现了它。方法返回一个迭代器。迭代器使用next方法来确定迭代中的下一个值。如果我从下面的类中删除next
方法,代码将失败
iterable=可以在…上迭代的对象,使用\uuuuu iter\uuuuu
迭代器=定义如何迭代的对象…从字面上看,下一个值是什么。这是通过\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
因此,您询问的代码片段实际上接受类对象(self是参数)并返回一个迭代器,这使得类对象可迭代。因此,在下面的示例中,我们实际上可以迭代类对象myObj
def __iter__(self):
return self
类测试:
定义初始化(self,a,b):
self.a=a
self.b=b
定义(自我):
回归自我
def next(自我):
如果self.a有点混乱。简言之,定义_uiter__;返回self实际上是将迭代器对象快速转换为iterable,以便您可以在for循环中使用它
回想一下,迭代器是具有下一个方法的对象,用于在执行迭代的过程中返回下一项。调用下一个方法后,迭代器的状态将更改
回想一下,iterable是一个带有_iter___方法的对象,其目的是返回一个新的迭代器来执行迭代
为了区分这些概念,让我们以迭代器OneToFourIterator和iterable OneToFourIterable为例
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
要使用for循环执行迭代,必须给它一个iterable,如下所示
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
最后,我认为人们为什么定义“iter”来返回self的答案是,不必像上面那样编写两个类,您可以快速地将迭代器转换为iterable,以便在for循环中使用它:
iterator = OneToFourIterator()
while True:
try:
current = iterator.next()
print current
except StopIteration:
break
这也让我有点困惑:)
好的,让我们看看python中的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循环将隐式调用一个.iter(),它应该是一个迭代器。此外,在python中,如果需要迭代器,该类必须实现“iterator”接口,这意味着它应该同时具有u iter_uuuu和u next_uu,并且u iter_u的效果是返回一个迭代器
然而,python中还有另一个称为iterable的概念,它是一个可以创建迭代器的工厂
好的,现在我们想要的是可以iter或者iterable,所以他们的iter方法必须返回一个迭代器
对于iterable,它应该返回一个迭代器(可能是另一个类实现了‘迭代器’接口),对于迭代器,是的,它本身就是一个迭代器,所以只需返回它自己
以下代码段是从Fluent Python复制的:
for i in a:
print i
你可以做:
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,')
以及:
如果在迭代器中删除_iter__,则只能使用:
for i in s:
print(s)
因为当您从iterable代码部分删除iterator类中可能重复的@vaultah ya its时,iter(s)不再是迭代器,所以我在许多其他方法中看到了这一部分,所以我只想知道为什么我们通常使用这部分代码您的意思是什么?你读了链接页面上的答案了吗?“The\uuuu iter\uuuuu
返回迭代器对象,并在循环开始时隐式调用”是您问题的答案。是的,我读过它,和其他人一样,它没有清除logicFluent Python,第14章→ 嗯,你确定这句话:如果你在迭代器中删除iter,for循环仍然有效吗?我的当然不。。。否则,上面的答案很好。@user7865286是的,您可以在迭代器中删除iter,在上面的代码段中,SentenceIterator是迭代器,您可以删除它并运行“for i in s:print s”。
for i in s:
print(s)
for i in s:
print(s)