Python - понимание функции отправки генератора
Я изучаю Python yield
и обнаруживаю, что yield
- это не только способ, которым генераторы выводят возвращаемое значение, но и способ поместить значения в генератор. Например, следующий код
def f():
print (yield),
print 0,
print (yield),
print 1
g = f()
g.send(None)
g.send('x')
g.send('y')
В глобальном масштабе это значение send
'x'
, 'y'
для генератора и, следовательно, в f
выводит x 0 y 1
. Но я не могу понять
- Есть 2
yield
, но 3 send
s. Зачем ему отправлять None
в первый раз?
- Он выталкивает
StopIteration
в последний send
. Есть ли способ избежать этого исключения?
Может ли кто-нибудь объяснить это? Спасибо заранее.
Ответы
Ответ 1
Из документации:
Когда send()
вызывается для запуска генератора, он должен быть вызван с None
в качестве аргумента, потому что не существует выражения yield
, которое могло бы получить значение.
Что касается исключения, вы не можете этого избежать. Генератор генерирует это исключение, когда он выполняет итерацию, поэтому вместо того, чтобы избегать его, просто поймайте его:
g = f()
try:
g.send(None)
g.send('x')
g.send('y')
except StopIteration:
print 'Done'