Я смотрел http://www.dabeaz.com/coroutines/, который я нахожу очень интересным, но в примере есть поведение, которое я не понимаю.Значение теряется в генераторе python/coroutine
В bogus.py например, сообщил здесь
# 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 ушло: после send(3)
, переменного n
правильно установлен, но при втором выполнении yield
, это похоже на то, что значение 3 просто не получено для цикла for.
Может кто-нибудь разъяснить мне, почему это происходит?
Отлично, спасибо! Я пропустил факт, в вашем третьем пункте, что 'send' на самом деле похож на' next' и, следовательно, имеет возвращаемое значение, исходящее из 'yield'. – AkiRoss
Добавление из спецификации ([pep-0342] (http://www.python.org/dev/peps/pep-0342/)) 2. Добавить новый метод send() для генераторов-итераторов, который возобновляет генератор и «отправляет» значение, которое становится результатом текущего выражения yield. Метод send() возвращает следующее значение, полученное генератором, или вызывает StopIteration, если генератор выходит, не давая другого значения. –
Я немного смущен тоже шагом3. , когда n == 5, выведите 5 и распечатайте его. Затем c.send (3), чтобы вызвать выход 3 в качестве возвращаемого значения обратно в c.send() и присвоить значение 3 newvalue Если мой оператор True, то почему, когда n == 3 для продолжения следующего чтобы получить значение newvalue = (выход n), не уступая значению n, но говоря, что значение n == 3 было отброшено? – rickhau