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
==最终答案==
use*_*ica 11
yield
是一种表达.它曾经是一个声明,它最常用作整个语句,但在Python 2.5中,它被转换为表达式作为新的协程支持的一部分.它仍然通常被称为"收益率声明",部分原因在于过时的文档和知识,部分原因是它主要用作声明.您可以在PEP 342中了解相关内容.
除以下形式外:
yield whatever
x = yield whatever
Run Code Online (Sandbox Code Playgroud)
yield表达式必须在出现的地方加上括号,以避免语法中的歧义.
根据语法:
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
语句与条件运算符,lambda
vs def
.