我正在尝试使用Python 3中的生成器,并编写了这个相当牵强附会的生成器:
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
被发送了"一个字符串",它被打印出来,然后Python尝试查找下一个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()
似乎没有尝试在将 x
赋值为 None
后查找下一个 yield
语句。
为什么行为略有不同?这与我如何启动生成器有关吗?
x = ...
的解释帮了很多。谢谢! - peoniclesx = yield 1
中,yield 1
和赋值(=
)是两个独立的步骤。如果我错了,请纠正我。 - nn0pyield 1
暂停,直到生成器被恢复,在这一点上表达式结果被分配给x
。 - Martijn Pieters