类中的python生成器

时间:2015-11-02 14:58:05

标签: python generator

我想创建一个类似于生成器的方法的类。我对发电机很新。这是我的代码:

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

我错过了什么?

1 个答案:

答案 0 :(得分:0)

在读取代码时,没有错误,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

因为生成器是特殊类型的迭代器,所以当它们像普通迭代器一样耗尽时会抛出一个StopIteration

所以为了避免你必须通过包含你需要的尽可能多的产量来预测这种行为,最好的方法是在MyGen类中创建一个无限生成器,如下所示:

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

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

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