收益 - 陈述或表达?

时间:2013-11-22 10:22:11

标签: python expression yield

所以,我一直在阅读this,并了解了如何向发送器发送值。

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

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

==编辑==

我做了我公平的阅读。

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

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

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

==最终答案==

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

3 个答案:

答案 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)

yield是陈述。

但是,关于这种语法,你提出的是一个很好的观点:x = (yield y)。 在我的脑海中,我无法想到python中的其他语句可以像这样使用。

阅读docs,当然还有这个传奇的question非常有用。