Image

Imageglader wrote in Imageru_python

Генераторы

День добрый.

Есть вот такой код:
# bogus.py
#
# Bogus example of a generator that produces and receives values

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

# The holy grail countdown
c = countdown(5)
for x in c:
    print x
    if x == 5:
        c.send(3)


Результат:
5
2
1
0

Объясните пожалуйста, почему он не выводит 3? Ведь после установки newvalue в 3 на следующем цикле как раз n равно трем. Почему это значение не возвращается?

UPD Поскольку возникли сомнения, выкладываю источник
Код взят со страницы http://www.dabeaz.com/coroutines/
Сам файл - http://www.dabeaz.com/coroutines/bogus.py
Презентация - http://www.dabeaz.com/coroutines/Coroutines.pdf (слайд №32)

Почему этот код на разных машинах выводит разную последовательность - я так и не понял :( . Я проверял на
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32 и
Python 2.5 (release25-maint, Dec 9 2006, 14:35:53) [GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-20)] on linux2
Оба раза тройка была пропущена