gpt4 book ai didi

python - 一个进入无限循环的简单 Python 迭代器

转载 作者:太空宇宙 更新时间:2023-11-04 10:02:03 25 4
gpt4 key购买 nike

我试图自己编写一个简单的倒计时迭代器,我实现了一个 __iter__() 函数和相应的 __next__() 来支持迭代器。我有在 __next__() 函数中使用了一个 yield 函数来在每次迭代对象时返回一个新值。当我使用 yield 时,与使用 return 语句相比,代码进入无限循环。以下是我的代码:

class MyIterator():
def __init__(self,value):
self.value = value
def __iter__(self):
return self
def __next__(self):
print("In the next function")
if self.value > 0:
yield self.value
self.value -= 1
else:
raise StopIteration("Failed to proceed to the next step")



if __name__ == '__main__':
myIt = MyIterator(10)
for i in myIt:
print(i)

O/P如下:

  <generator object __next__ at 0x101181990>
<generator object __next__ at 0x1011818e0>
<generator object __next__ at 0x101181990>
<generator object __next__ at 0x1011818e0>

and so on for infinite times....

最佳答案

你的 __next__方法本身应该是一个生成器。替换 yieldreturn :

def __next__(self):
print("In the next function")
if self.value > 0:
return_value = self.value
self.value -= 1
return return_value
else:
raise StopIteration("Failed to proceed to the next step")

请注意,您仍然需要减少 self.value在确定要返回的内容之后,因此使用单独的 return_value变量。

yield 的任何函数(或方法)在其中调用时会生成一个生成器对象,然后该生成器就是可迭代的。这样的对象然后有一个 __iter__返回 self 的方法和一个 __next__调用时将产生下一个值的方法。这就是您看到 <generator object __next__ at 0x1011818e0> 的原因每次打印对象 __next__被称为。

然而,如果你的对象本身是一个可迭代对象,你的 __next__方法应该返回序列中的下一个值。它会被反复调用直到它引发StopIteration。 .这不同于使用 yield ,它应该立即返回,而不是推迟到以后!

演示:

>>> class MyIterator():
... def __init__(self,value):
... self.value = value
... def __iter__(self):
... return self
... def __next__(self):
... print("In the next function")
... if self.value > 0:
... return_value = self.value
... self.value -= 1
... return return_value
... else:
... raise StopIteration("Failed to proceed to the next step")
...
>>> myIt = MyIterator(10)
>>> for i in myIt:
... print(i)
...
In the next function
10
In the next function
9
In the next function
8
In the next function
7
In the next function
6
In the next function
5
In the next function
4
In the next function
3
In the next function
2
In the next function
1
In the next function

如果你想使用生成器函数,制作__iter__生成器,并使用一个循环:

class MyIterator():
def __init__(self,value):
self.value = value
def __iter__(self):
value = self.value
while value > 0:
yield value
value -= 1

但是,这会使您的 MyIterator类是可迭代对象,而不是迭代器。相反,每次您使用 for loop 创建一个 new 迭代器(__iter__ 生成器对象),然后对其进行迭代。使用 __next__使您的对象成为只能迭代一次的迭代器。

关于python - 一个进入无限循环的简单 Python 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43031758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com