收益 - 陈述或表达?

Fil*_*zak 8 python expression yield

所以,我一直在阅读这篇文章,并了解了如何向生成器发送值.

而现在我有点困惑.产量是陈述还是表达?它不像函数一样使用括号语法,所以它看起来像语句.但它返回值,所以它就像表达式.

就在不久前,我已经开始讨论"为什么python没有'如果x = foo():( ...)'?" (为什么我们不能在if语句条件中分配).我说,语句是原子的,所以赋值语句和if语句应该分开.现在,我不知道该怎么想.

==编辑==

我做了我公平的阅读.

http://docs.python.org/2/reference/expressions.html#generator.send - "value参数成为当前yield表达式的结果."

因此,产生HAS值.我明白了,所有的文档都说这是一个陈述,但如果陈述可能有价值,那么表达和陈述之间的差异到底是什么?

另外,我知道什么是生成器,协同程序等等.我需要元语义或文档的语义:D

==最终答案==

显然,收益率可以是两者.只需阅读这些答案:(1)(2) - 我发现它们最有帮助.

use*_*ica 11

yield是一种表达.它曾经是一个声明,它最常用作整个语句,但在Python 2.5中,它被转换为表达式作为新的协程支持的一部分.它仍然通常被称为"收益率声明",部分原因在于过时的文档和知识,部分原因是它主要用作声明.您可以在PEP 342中了解相关内容.

除以下形式外:

yield whatever
x = yield whatever
Run Code Online (Sandbox Code Playgroud)

yield表达式必须在出现的地方加上括号,以避免语法中的歧义.


geo*_*org 5

根据语法:

yield_stmt: yield_expr
Run Code Online (Sandbox Code Playgroud)

yield_expr: 'yield' [testlist]
Run Code Online (Sandbox Code Playgroud)

也就是说,yield x可以两者兼备,具体取决于具体情况:

 if foobar:
    yield x   # statement

 y = yield x   # expression
Run Code Online (Sandbox Code Playgroud)

这个表达式/语句二元性可能令人困惑,但完全符合python的精神,比较for循环与for理解,if语句与条件运算符,lambdavs def.