【问题标题】:Passing value to yield using send使用 send 将值传递给 yield
【发布时间】:2013-12-14 04:43:12
【问题描述】:

当我在谷歌上搜索 python yield 时,我发现了一些有趣的东西,我以前从未知道过,即我们可以将值传递给 yield 以更改 next() 值。我希望一些新的 pythonist 现在可能会意识到这一点,我也不确定它是如何工作的。所以,如果有任何机构可以解释它是如何工作的,以及当我使用send() 发送新索引以产生时行为如何变化。

这是我的 sn-ps:

def print_me (count):
    i = 0
    while i < count:
        val = (yield i)
        if val is not None:
            i = val
        else:
            i += 1

gen = print_me(10)

for i in gen:
   if i == 5:
       gen.send(8)
   else:
       print i

这是我的输出:

0
1
2
3
4
9

【问题讨论】:

  • 您的问题是什么?你不理解行为的哪一部分?
  • 当我发送一个新索引时,屈服点如何指向新索引。基本上我很困惑yield 是使用某种链表还是?
  • 我不太明白您所说的“屈服点如何指向新索引”是什么意思。当您使用send 时,您发送的值将成为yield 表达式的值。如何在生成器中使用它取决于您。
  • 这个“增强的”生成器语法是在 python 2.5 中添加的,用于构建协程。 read more in the PEP
  • 这里有一些有趣的相关信息:stackoverflow.com/q/12324096/748858

标签: python python-2.7 yield


【解决方案1】:

您的测试代码实际上很有启发性。在像这样的生成器函数中发生的情况是,每当您在生成器上调用 next 时,代码都会被执行,直到遇到 yield 语句。产生该值,然后在生成器中“暂停”执行。如果您向生成器.send 一些数据,则该值将从yield返回。如果你没有 .send 任何东西,yield 将返回 None

所以在你的代码中,当你 .send(8) 时,它会在你的生成器中设置 val = 8 (val = yield i)。因为val is not Nonei 设置为8.send 实际上一直执行到下一个 yield 语句(返回该值 -- 8)。然后一切恢复正常(下一个要生成的数字是9)。

【讨论】:

  • 需要注意的重要一点是send 推进了生成器(即,运行它直到下一个yield 并为您提供下一个值)。这有时会让人们感到困惑。
  • @BrenBarn -- 谢谢,确实如此(我总是需要查一下)。我已经澄清了一点答案。
  • 谢谢@BrenBarn 和 mgilson。我想我现在明白了。
  • 这个推进 yield 有什么用例吗?我什么也没看到。
  • @yopy -- 协程。我自己没有使用过它们,所以我真的不能给你一个好的用例。看看 roippi 发布的 PEP 中的协程和信息。
猜你喜欢
  • 1970-01-01
  • 2012-09-17
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多