【问题标题】:Python next and send in same generator接下来是 Python 并发送同一个生成器
【发布时间】:2015-02-22 02:10:07
【问题描述】:
鉴于我对yield 的理解,我写的这个python 的sn-p 的行为并不符合我的预期。也许有人可以启发我。
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
谁能解释这种行为?
【问题讨论】:
标签:
python
send
yield
next
【解决方案1】:
有两个问题。一个是通过将生成器推进 3 次,您只能将其推进到最后一个产量,而不是之后的代码。另一个是send 将其值作为 yield 语句的值,其中执行 先前暂停,而不是下一个。以下是对所发生情况的分步说明:
- 您对
next 的第一次调用会执行第一个yield 3。
- 您对
send(4) 的下一次调用会导致yield 3 的计算结果为4,但您在printvar 中没有对此进行任何操作,因此该值被丢弃。 .send(4) 还将生成器推进到第一个 data = yield,产生 None。
- 您对
.send(5) 的下一次调用会导致这个第一个data = yield 将数据设置为5,并将生成器推进到最后一个yield,再次产生None。
- 就是这样。您不再进一步推进生成器,因此执行会在最后一个
yield 处停止,永远不会执行最后一个 print。
使用send 时要记住的一点是,它将值发送到已经产生的地方,而不是发送到接下来要产生的地方。更多解释见this similar question。
【解决方案2】:
试试这个:
def printvar():
data = yield 3
print(data)
data = yield
print(data)
x = printvar()
print(next(x))
x.send(4)
x.send(5)
在您的原始代码中,send(4) 无处可去
因为 yield 语句没有收集
任何东西。