У меня есть функция, называемая х, что производит генератор, как это:«выход» в Python
a = 5
def x():
global a
if a == 3:
raise Exception("Stop")
a = a - 1
yield a
Тогда в оболочке питона я называю эту функцию так:
>>> print x().next()
>>> 4
>>> print x().next()
>>> 3
>>> print x().next()
>>> <python-input-112-f3c02bba26c8> in x()
2 global a
3 if a == 3:
----> 4 raise Exception
5 a = a - 1
6 yield a
Exception:
Однако , когда я называю эту функцию и назначаю ее переменной, она ведет себя по-разному:
>>> a = 5
>>> b = x()
>>> print b.next()
>>> 4
>>> print b.next()
>>> ----> 1 b.next()
StopIteration:
Как это возможно? Не следует ли распечатывать и поднять StopIteration на следующей итерации?
PS: Я знаю, что при первом вызове функции корпус не запускается, просто производит генератор. То, что я не понял, - это то, что меняется, если я вызываю и назначаю его переменной?
OMG, как вы можете написать весь этот текст за 3 минуты? – Matthias
@Matthias: Я быстрый типер, но вы также получаете до 5 минут грациозности, чтобы добавить к сообщению без последнего отредактированного обновления времени. –
+1 Отличное объяснение. –