2013-07-13 4 views
0
def h(): 
    print 'Wen Chuan', 
    m = yield 5 # Fighting! 
    print m 
    d = yield 12 
    print 'We are together!' 
c = h() 
m = c.next() #m gets the value of yield 5 
d = c.send('Fighting!') #d gets the value of yield 12 
print 'We will never forget the date', m, '.', d 

Пожалуйста, проверьте код выше. Это работает результат ниже:Почему возвращаемое значение доходности изменяется таким образом?

>>> ================================ RESTART ================================ 
>>> 
Wen Chuan Fighting! 
We will never forget the date 5 . 12 

И по моему пониманию, первое возвращение выход значение изменяется на «Fighting!» уже, но почему позже, когда print m все еще показывает значение 5?

ответ

2

Нет, вы не меняете то, что выражение yield 5 производит генератор.

.send() изменит то, что местное mвнутри h() будет установлен только.

Что происходит:

  • Вы создаете h(), функцию генератора, и исполнение заморожено.
  • Вы вызываете .next() на генератор. Выполнение возобновляется, печатается 'Wen Chuan', и код работает до выражения yield 5. 5 возвращается и присваивается глобальному m. Генератор снова приостановлен.
  • Вы звоните c.send('Fighting!'). Выполнение возобновляется, 'Fighting!' присваивается локальной переменной m в функции генератора, print m печатает это. yield 12, генератор приостанавливается и 12 присваивается глобальной переменной d.
  • 'We will never forget the date', 5, '.', 12 печатается.

К этому моменту функция генератора все еще приостановлена, и последняя строка функции генератора никогда не выполняется. Если вы снова должны позвонить .next(), тогда будет напечатан 'We are together!', конец генератора и StopIteration будут подняты.

1

m внутри и вне функции - это разные переменные, которые не влияют друг на друга.

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