【问题标题】: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 语句的值,其中执行 先前暂停,而不是下一个。以下是对所发生情况的分步说明:

    1. 您对next 的第一次调用会执行第一个yield 3
    2. 您对send(4) 的下一次调用会导致yield 3 的计算结果为4,但您在printvar 中没有对此进行任何操作,因此该值被丢弃。 .send(4) 还将生成器推进到第一个 data = yield,产生 None。
    3. 您对.send(5) 的下一次调用会导致这个第一个data = yield 将数据设置为5,并将生成器推进到最后一个yield,再次产生None。
    4. 就是这样。您不再进一步推进生成器,因此执行会在最后一个 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 语句没有收集 任何东西。

      【讨论】:

        猜你喜欢
        • 2012-11-17
        • 1970-01-01
        • 1970-01-01
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        • 2014-07-05
        相关资源
        最近更新 更多