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'