При чтении кода ошибки нет, и исключение, вызванное 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
Теперь вы можете перебирать столько, сколько хотите, из генератора, созданного этим методом.
Ваш генератор возвращает только одно значение (это всего лишь одно утверждение выхода не внутри любых циклов). Попытка получить другое значение правильно приводит к исключению «StopIteration», сигнализируя, что больше нет значений. –
Хорошо стоит прочитать следующее: http://stackoverflow.com/a/231855/1832539 – idjaw
Другими словами: вы ничего не пропустили, он ведет себя точно так, как ожидалось. – jonrsharpe