繁体   English   中英

类中的python生成器

[英]python generators in a class

我想创建一个类,该类具有一个类似于生成器的方法。 我对发电机还很陌生。 这是我的代码:

class MyGen:

    def __init__(self):
        self.a = 0

    def create_generator(self):
        yield self.a
        self.a += 1

if __name__ == "__main__":
    myGenInstance = MyGen()
    myGen = myGenInstance.create_generator()
    for i in range(3):
        print(next(myGen))

我收到此错误:

Traceback (most recent call last):
0
File "C:/Users/tvavr/PycharmProjects/filter/geneŕator_test.py", line 17, in <module>
print(next(myGen))
StopIteration
Process finished with exit code 1

我想念什么?

读取代码时,没有错误,并且python引发的异常是正常现象。

create_generator方法只能产生一个值,因为仅使用了一个产量。

考虑到:

class Mygen:
    def __init__(self):
        self.a = 0

    def create_generator(self):
        yield self.a
        self.a += 1

        yield self.a
        self.a += 1

        yield self.a

当您按照以下方式运行代码时,请注意发生了什么:

if __name__ == "__main__":
my_gen_instance = MyGen()
my_gen = my_gen_instance.create_generator()
for i in range(3):
    print('the value number', i, 'is:', next(myGen))

输出将是:

the value number 0 is 0
the value number 1 is 1
the value number 2 is 2

现在,如果我们将范围从3更改为4,看看会发生什么:

if __name__ == "__main__":
    my_gen_instance = MyGen()
    my_gen = my_gen_instance.create_generator()
    for i in range(4):
        print('the value number', i, 'is:', next(myGen))

输出将是:

the value number 0 is 0
the value number 1 is 1
the value number 2 is 2
Traceback (most recent call last):
  File "pygen.py", line 21, in <module>
    print('the value number', i, 'is', next(my_gen))
StopIteration

因为generator是特殊类型的迭代器,所以它们像普通迭代器一样用尽时会抛出StopIteration

因此,为了避免必须通过包含所需的尽可能多的收益来预期这种行为,最好的方法是在MyGen类内创建无限生成器,如下所示:

class MyGen:
    def __init__(self):
        self.a = 0

    def create_generator(self):
        while True:
            yield self.a
            self.a += 1

现在,您可以根据需要对这个方法创建的生成器进行尽可能多的迭代。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM