Я экспериментировал с генераторами в Python 3 и написал это довольно надуманный генератор:Python: Поведение Send() в генераторах
def send_gen():
print(" send_gen(): will yield 1")
x = yield 1
print(" send_gen(): sent in '{}'".format(x))
# yield # causes StopIteration when left out
gen = send_gen()
print("yielded {}".format(gen.__next__()))
print("running gen.send()")
gen.send("a string")
Выход:
send_gen(): will yield 1
yielded 1
running gen.send()
send_gen(): sent in 'a string'
Traceback (most recent call last):
File "gen_test.py", line 12, in <module>
gen.send("a string")
StopIteration
Так gen.__next__()
достигает линии x = yield 1
и дает 1. Я думал, что x
будет присвоено None
, затем gen.send()
будет искать следующийyield
заявление, потому что x = yield 1
"используется", затем получить StopIteration
.
Вместо того, что кажется, произошло то, что x
отправляется «строка», напечатанный, затем затем попытки питона, чтобы искать следующий yield
и получает StopIteration
.
Так я попробовать это:
def send_gen():
x = yield 1
print(" send_gen(): sent in '{}'".format(x))
gen = send_gen()
print("yielded : {}".format(gen.send(None)))
Выход:
yielded : 1
Но теперь нет никакой ошибки. send()
похоже не пытался найти следующийyield
заявление после присвоения x
по None
.
Почему поведение немного отличается? Это связано с тем, как я начал генераторы?
Ahhh Я вижу. Объяснения 'x = ...' очень помогли. Благодаря ! – peonicles