根据我对 yield
的理解,我编写的这段 python 的行为方式与我预期的不同。也许有人可以启发我。
def printvar():
yield 3
data = yield
print(data)
data = yield
print(data)
x = printvar()
print(next(x))
x.send(4)
x.send(5)
我的期望:
3
4
5
我得到的:
3
5
谁能解释这种行为?
最佳答案
有两个问题。一个是通过将生成器推进三次,你只将它推进到最后一次产出,而不是之后的代码。另一个是 send
将其值作为 yield 语句的值,其中执行被先前暂停,而不是下一个。以下是对所发生情况的逐步解释:
- 您对
next
的第一次调用会执行第一个yield 3
。 - 您对
send(4)
的下一次调用会导致yield 3
的计算结果为 4,但您不会在printvar
中对此执行任何操作>,所以该值被丢弃。.send(4)
还将生成器推进到第一个data = yield
,产生 None。 - 您对
.send(5)
的下一次调用会导致此 firstdata = yield
将数据设置为 5,并且还会推进生成器到最后一次产量,再次产生 None。 - 就是这样。您不会进一步推进生成器,因此执行会在最后一个
yield
处停止,永远不会执行最后一个print
。
使用send
时要记住的是,它会将值发送到已经产生 的地方,而不是发送到下一个要产生的地方。参见 this similar question以获得更多解释。
关于接下来使用 Python 并发送相同的生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27628745/