我试图自己编写一个简单的倒计时迭代器,我实现了一个__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如下:
^{pr2}$
这里有点混乱。使用yield时,不需要创建迭代器类。生成器已经是迭代器。在
因此,将yield改为return,它将执行您想要的操作:-)
另外,您还需要在
return
之前更新self.value
。修复代码如下:下面是如何用发电机做同样的事情:
^{pr2}$如您所见,生成器使程序员的生活更轻松:-)
您的
__next__
方法应该而不是本身是生成器。将yield
替换为return
:注意,在确定要返回的内容之后,仍然需要减少
self.value
,因此需要使用单独的return_value
变量。在任何包含
yield
的函数(或方法)在被调用时都将生成一个生成器对象,该生成器就是iterable。这样的对象有一个返回__iter__
的方法和一个在调用时产生下一个值的__iter__
方法和一个__next__
方法。这就是为什么每次调用__next__
时都会看到<generator object __next__ at 0x1011818e0>
对象被打印。在但是,为了使对象本身成为iterable,您的
__next__
方法应该返回序列中的下一个值。它将被反复调用,直到它引发StopIteration
。这与使用yield
不同,它应该立即返回,而不是推迟到稍后!在演示:
^{pr2}$如果要使用生成器函数,请将
__iter__
作为生成器,并使用循环:但是,这使您的
MyIterator
类成为iterable,而不是迭代器。相反,每次使用for
循环时,都会创建一个新的迭代器(即__iter__
生成器对象),然后对其进行迭代。使用__next__
使对象成为迭代器,只能在上迭代一次。在相关问题 更多 >
编程相关推荐