2015-11-02 3 views
1

Я хотел бы создать класс, который имеет метод, действующий как генератор. Я довольно новичок в генераторах. Вот мой код:Генераторы python в классе

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 

Что мне не хватает?

+4

Ваш генератор возвращает только одно значение (это всего лишь одно утверждение выхода не внутри любых циклов). Попытка получить другое значение правильно приводит к исключению «StopIteration», сигнализируя, что больше нет значений. –

+0

Хорошо стоит прочитать следующее: http://stackoverflow.com/a/231855/1832539 – idjaw

+0

Другими словами: вы ничего не пропустили, он ведет себя точно так, как ожидалось. – jonrsharpe

ответ

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 

Теперь вы можете перебирать столько, сколько хотите, из генератора, созданного этим методом.

Смежные вопросы