所以,我一直在阅读this,并了解了如何向发送器发送值。
现在我有点困惑。产量是陈述还是表达?它不像函数一样使用括号语法,所以它看起来像语句。但它返回值,所以它就像表达式。
不久前,我已经开始讨论“为什么python没有'如果x = foo():( ...)'?” (为什么我们不能在if语句条件中分配)。我说,语句是原子的,所以赋值语句和if语句应该分开。现在,我不知道该怎么想。
==编辑==
我做了我公平的阅读。
http://docs.python.org/2/reference/expressions.html#generator.send - “value参数成为当前yield表达式的结果。”
因此,产生HAS值。我明白了,所有的文档都说这是一个陈述,但如果陈述可能有价值,那么表达和陈述之间到底有什么区别呢?
另外,我知道什么是生成器,协同程序等等。我需要元语义或文档的语义:D
==最终答案==
答案 0 :(得分:11)
yield
is an expression。它曾经是一个声明,它最常用作整个语句,但在Python 2.5中,它被转换为表达式作为新的协程支持的一部分。它仍然通常被称为“收益率声明”,部分原因是过时的文档和知识,部分原因是它主要用作声明。您可以在PEP 342中了解相关内容。
除以下形式外:
yield whatever
x = yield whatever
yield表达式必须在出现的地方加上括号,以避免语法中的歧义。
答案 1 :(得分:5)
根据the grammar:
yield_stmt: yield_expr
和
yield_expr: 'yield' [testlist]
也就是说,yield x
可以是两者,具体取决于上下文:
if foobar:
yield x # statement
y = yield x # expression
这个表达式/语句二元性可能令人困惑,但完全符合python的精神,比较for
循环与for
理解,if
语句与条件运算符,{{1 }} vs lambda
。
答案 2 :(得分:1)