2013-09-25 2 views
1

Вот код (любезно Дэвид Бизли, слайд # 32 http://dabeaz.com/coroutines/Coroutines.pdf):Почему этот код печати 3

def countdown(n): 
    print "Counting down from", n 
    while n >= 0: 
    newvalue = (yield n) 
    # If a new value got sent in, reset n with it 
    if newvalue is not None: 
     n = newvalue 
    else: 
     n -= 1 

c = countdown(5) 
for n in c: 
    print n 
    if n == 5: 
    c.send(3) 

И вот результат: http://codepad.org/8eY3HLsK

Я понимаю, что это Безразлично» t print 4, но почему он не печатает 3? Когда n установлено в 3, следующая итерация должна дать 3, а не 2? Что мне не хватает?

ответ

4

В documented, посылая значение генератора также вызывает генератор для продвижения еще один шаг и доходность его следующее значение. Значение 3 получается на линии c.send(3), но вы ничего не делаете с ним, чтобы не видеть его. Затем при следующей поездке через цикл while он продолжает отсчет оттуда. Если вы измените последнюю строку print c.send(3) тогда вы увидите 3.

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