【问题标题】:yield - statement or expression?yield - 语句或表达式?
【发布时间】:2013-12-07 04:35:03
【问题描述】:

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

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

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

== 编辑 ==

我读了相当多的书。

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

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

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

== 最终答案 ==

显然,yield 可以两者兼而有之。只需阅读这些答案:(1)(2) - 我发现它们最有帮助。

【问题讨论】:

  • yield 是一个声明
  • 你也可以看这篇文章jeffknupp.com/blog/2013/04/07/…
  • 只是想知道,为什么语句与表达式很重要?我自己从来没有真正考虑过。 =/
  • 我喜欢了解我使用的语言的结构,还 - 我喜欢玩解析器、形式语言等。从我坐的地方看,就像大脑发痒。

标签: python expression yield


【解决方案1】:

yield is an expression。它曾经是一个语句,并且最常作为一个完整的语句使用,但在 Python 2.5 中,它变成了一个表达式,作为新的协程支持的一部分。它仍然通常被称为“收益声明”,部分原因是文档和知识过时,部分原因是它主要用作声明。您可以在PEP 342 中阅读相关内容。

除了以下几种形式:

yield whatever
x = yield whatever

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

【讨论】:

  • 哈!所以,毕竟,当我声称每个 python 语句都是原子的时,我是对的。这让我头脑清醒,非常感谢;)
【解决方案2】:

yield 是声明。

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

阅读docs很有用,当然还有这个传奇的question

【讨论】:

  • 如果与生成器的.send() 工具一起使用,它也会返回一个值。
猜你喜欢
  • 2013-12-16
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2018-07-25
  • 2010-10-19
相关资源
最近更新 更多