接下来使用 Python 并发送相同的生成器

标签 python send yield next

根据我对 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 语句的值,其中执行被先前暂停,而不是下一个。以下是对所发生情况的逐步解释:

  1. 您对 next 的第一次调用会执行第一个 yield 3
  2. 您对 send(4) 的下一次调用会导致 yield 3 的计算结果为 4,但您不会在 printvar 中对此执行任何操作>,所以该值被丢弃。 .send(4) 还将生成器推进到第一个 data = yield,产生 None。
  3. 您对 .send(5) 的下一次调用会导致此 first data = yield 将数据设置为 5,并且还会推进生成器到最后一次产量,再次产生 None。
  4. 就是这样。您不会进一步推进生成器,因此执行会在最后一个 yield 处停止,永远不会执行最后一个 print

使用send 时要记住的是,它会将值发送到已经产生 的地方,而不是发送到下一个要产生的地方。参见 this similar question以获得更多解释。

关于接下来使用 Python 并发送相同的生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27628745/

相关文章:

python - 如何根据 Pandas 中的奇数/偶数日期创建 bool 列?

python - 如何逆向系统范围内的 Flask 安装

python - 如何在 python 的 BeautifulSoup4 中使用 .next_sibling 时忽略空行

python - 识别 Postgres 中重复的时间序列

python - 输入文本以跨越 Selenium/Python

python - 在 Scala 中实现 'yield' 的首选方法是什么?

python - 将带有 yield(string) 的 python 函数翻译成 C++

c++ - 发送矩阵的行和列,MPI_SEND

sockets - 在一个套接字上同时进行 recv() 和 send() 是否安全?

python - 如何更改屈服值