Python中yield表达式的结果是什么?

sla*_*acy 55 python yield generator

我知道yield将函数转换为生成器,但yield表达式本身的返回值是多少?例如:

def whizbang(): 
    for i in range(10): 
        x = yield i
Run Code Online (Sandbox Code Playgroud)

x这个函数执行时变量的值是多少?

我已经阅读了Python文档:http://docs.python.org/reference/simple_stmts.html#grammar-token-yield_stmt,似乎没有提到yield表达式本身的值.

jam*_*lak 61

您还可以为send生成器赋值.如果发送,则没有价值x就是None,否则x需要在发送值.以下是一些信息:http://docs.python.org/whatsnew/2.5.html#pep-342-new-generator-features

>>> def whizbang():
        for i in range(10):
            x = yield i
            print 'got sent:', x


>>> i = whizbang()
>>> next(i)
0
>>> next(i)
got sent: None
1
>>> i.send("hi")
got sent: hi
2
Run Code Online (Sandbox Code Playgroud)

  • 哇.为什么在文档中没有提到收益率完全超出我的范围.我在哪里提交doc bug? (5认同)
  • 这是一个doc bug?在http://docs.python.org/reference/expressions.html#yield-expressions中,第二段以``恢复后yield表达式的值取决于恢复执行的方法.接下来是方法定义`next()`说`当使用next()方法恢复生成器函数时,当前yield表达式总是求值为None.下一个列出的方法是`send()`:`value参数变为当前收益率表达的结果.就在那里. (4认同)
  • @slacy,是吗?它在[yield]的文档中提到(http://docs.python.org/reference/expressions.html#generator.send). (3认同)
  • @slacy,虽然我在环顾四周后承认,从目录中找到它有点难. (3认同)
  • @MatthewTrevoryield 语句和yield 表达式的文档的剪切和粘贴以及彼此的修改版本都很糟糕。在yield语句文档中根本没有提及yield表达式(以及它们的不同行为)。我认为许多程序员,甚至像我这样的高级程序员都会失去这一点。 (2认同)
  • 关于*语句*的文档不讨论*表达式*,我并不奇怪,它们是两个不同的东西。当您寻找*yield 表达式*的结果时,阅读语句是浪费时间,我希望“高级”程序员能够意识到这一点。这三行每一行都非常清楚,准确地告诉您您想知道的内容(它们“明确”说明了表达式的计算结果!)并且显然已放置在文档中。 (2认同)
  • 有趣的是,你必须在 `send()` 之前至少调用一次 `next()`,否则你会得到 `TypeError: can't send non-None value to a just-started generator` (2认同)