yield - 是一个语句还是表达式?

9

所以,我一直在阅读this,发现了关于向生成器发送值的内容。

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

不久前,我曾经谈到过“为什么Python没有'if x=foo():(...)'?”(为什么我们不能在if语句条件中赋值)。我说,语句是原子的,所以赋值语句和if语句应该分开。现在,我不知道该怎么想了。

==编辑==

我做了我的功课阅读。

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

所以,yield有值。我明白了,所有文档都说它是一个语句,但是如果语句可能有值,那么表达式和语句之间到底有什么区别呢?

此外,我知道生成器、协程等等。我需要元语义或文档的语义 :D

== 最终答案 ==

显然,yield 可以是两者。只需要阅读这些答案:(1)(2) - 我认为它们非常有帮助。


yield 是一个语句。 - K DawG
您也可以阅读此文章http://www.jeffknupp.com/blog/2013/04/07/improve-your-python-yield-and-generators-explained/。 - iMom0
只是好奇,为什么语句和表达式的区别很重要?我自己从来没有真正考虑过它。 =/ - huggie
1
我喜欢了解我使用的语言结构,同时 - 我喜欢玩解析器、形式语言等。从我的角度来看,这就像是大脑痒痒的感觉。 - Filip Malczak
2个回答

15

yield是一个表达式。它曾经是一条语句,通常被用作整个语句,但在Python 2.5中,它被转化为表达式作为新协程支持的一部分。由于过时的文档和知识以及它通常被用作语句的缘故,它仍然通常被称为“yield语句”。你可以在PEP 342中了解更多相关信息。

除以下形式之外:

yield whatever
x = yield whatever

无论在何处出现,yield表达式都必须使用括号括起来,以避免语法上的歧义。


哈!所以,当我声称每个Python语句都是原子时,我是正确的。这澄清了我的头脑,非常感谢;) - Filip Malczak

0

yield 是一个语句。

不过,你提到的这个语法:x = (yield y),确实是个好点子。 就我目前所知,在 Python 中没有其他可以像这样使用的 语句

阅读文档和当然,这个传奇的问题是很有用的。


2
如果与生成器的.send()功能一起使用,它还会返回一个值。 - glglgl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接