进入无限循环的简单Python迭代器

2024-04-18 09:00:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图自己编写一个简单的倒计时迭代器,我实现了一个__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}$

Tags: theto函数代码selfreturnifvalue
2条回答

这里有点混乱。使用yield时,不需要创建迭代器类。生成器已经是迭代器。在

因此,将yield改为return,它将执行您想要的操作:-)

另外,您还需要在return之前更新self.value。修复代码如下:

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

下面是如何用发电机做同样的事情:

^{pr2}$

如您所见,生成器使程序员的生活更轻松:-)

您的__next__方法应该而不是本身是生成器。将yield替换为return

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的函数(或方法)在被调用时都将生成一个生成器对象,该生成器就是iterable。这样的对象有一个返回__iter__的方法和一个在调用时产生下一个值的__iter__方法和一个__next__方法。这就是为什么每次调用__next__时都会看到<generator object __next__ at 0x1011818e0>对象被打印。在

但是,为了使对象本身成为iterable,您的__next__方法应该返回序列中的下一个值。它将被反复调用,直到它引发StopIteration。这与使用yield不同,它应该立即返回,而不是推迟到稍后!在

演示:

^{pr2}$

如果要使用生成器函数,请将__iter__作为生成器,并使用循环:

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

但是,这使您的MyIterator类成为iterable,而不是迭代器。相反,每次使用for循环时,都会创建一个新的迭代器(即__iter__生成器对象),然后对其进行迭代。使用__next__使对象成为迭代器,只能在上迭代一次。在

相关问题 更多 >