【问题标题】:Why does the yield function not require parentheses in Python?为什么yield函数在Python中不需要括号?
【发布时间】:2015-07-17 03:41:39
【问题描述】:

在 Python 中,我多次看到用于创建生成器的 yield 函数。 this 和 print 函数在技术上都执行方法的操作,因为它们返回一个值。但是,在从 Python 2 到 Python 3 的更改过程中,print 函数像普通方法调用一样获得了括号,但 yield 保持不变。此外,yield 获得保留关键字的黄色,而 print 是保留方法的紫色。为什么yield 不被视为一种方法并以这种方式着色并且不使用括号语法?

(同理,为什么return 也没有括号?)

让我添加更多内容,yield 和 continue 在许多其他语言中也没有括号。我只是想知道除了保留之外是什么使它与众不同。还有许多其他保留方法可以得到括号。

【问题讨论】:

  • 它不是函数
  • 指出return 缺少括号
  • 因为这是指定语言的方式。您不妨问一下为什么关键字是英语而不是世界语 :-) 我很难弄清楚答案对除了好奇心之外的任何人实际上有何用处。
  • 您的答案在PEP 255。以后,如果你想知道为什么在 python 中有某种方式,请查看相关的PEP
  • 说真的,您通过颜色区分关键字和功能?

标签: python python-2.7 python-3.x yield-keyword


【解决方案1】:

所以我去寻找答案。 And it turns out, there is one。从 PEP 255 开始,给我们yield 关键字的鼓舞士气

问。为什么要为“产量”添加新关键字?为什么不用内置函数呢?

A.通过 Python 中的关键字可以更好地表达控制流,并且 产量是一个控制结构。它也被认为是有效的 Jython 中的实现要求编译器能够 在编译时确定潜在的暂停点,以及一个新的 关键字使这很容易。 CPython 参考实现也 大量利用它来检测哪些函数生成器- 函数(尽管用一个新关键字代替“def”可以解决这个问题 对于 CPython——但人们会问“为什么要使用新关键字?”问题 不想要任何新关键字)。

问:那为什么不用新关键字的其他特殊语法呢?为了 例如,其中之一而不是“产量 3”:

   return 3 and continue
   return and continue 3
   return generating 3
   continue return 3
   return >> , 3
   from generator return 3
   return >> 3
   return << 3
   >> 3
   << 3
   * 3

A:我错过了一个吗?在数百条消息中,我数了三条 提出了这样的替代方案,并从中提取了上述内容。 不需要 new 关键字会很好,但让 yield 更好 非常清楚——我不想推断收益率是 发生在理解以前毫无意义的序列 关键字或运算符。不过,如果这引起了足够的兴趣, 支持者应该解决一个单一的共识建议,Guido 会在上面发声。

【讨论】:

  • 非常感谢您的回答。我只是想,既然到目前为止编程中的一切都是合乎逻辑的,那么这个必须有一个逻辑。
  • @ytpillai 谢天谢地,你是从 Python 而不是 PHP(或 ksh)开始的——否则你可能会掉头发!
  • 我听说 PHP 被描述为一个工具箱,其中的一切都只是一点点......off.
  • yield 作为一个函数对我来说毫无意义。它在任何方面都不像函数。如果考虑调用堆栈,它几乎与函数完全相反。
【解决方案2】:

print 不是一个获得括号的函数:它从一个语句变成了一个函数。 yield 仍然是一个声明,例如 return。语法突出显示特定于您的开发环境。

您可以找到有关the difference between expressions and statements here 的更多信息,以及有关the difference between functions and statements here 的更多信息。另请参阅 simple statementscompound statements 上的文档。

【讨论】:

  • 为什么这些被认为是陈述?
  • 为什么不是其他的,只有这些?
【解决方案3】:

yield不是函数,是关键字,根据its grammar不需要括号-

yield_atom ::= "(" yield_expression ")"

yield_expression ::= "yield" [表达式列表]

print 曾经是 Python 2 中的语句,但在 Python 3 中使用 PEP 3105 更改为内置函数

【讨论】:

  • 人们是否只是决定 yield 不带括号,还是这个概念背后有某种逻辑或起源?
  • 不,print 成为函数背后有某种起源,yield 本身不是应用程序级别的功能,但 print 是,大多数其他语言也有 print 作为function ,因此将 print 作为语句将需要解释器对其进行特殊处理,而他们不想这样做。
  • 只有函数调用需要括号。请去看看python文档。
【解决方案4】:

print 是 Python 2 中语言规范定义的关键字,成为内置函数(由标准库定义规范)Python 3。yield 曾经是,现在仍然是一个关键字

【讨论】:

  • 即使是内置的,还有很多其他的内置函数,比如hash()set()以及通用的int()为什么要加括号?
  • 它们是函数
  • 某事物如何成为关键字而另一事物成为函数?
  • 我的意思是,它们都像一种接收数据、处理并返回值的方法
  • yield 语句不接收数据,不处理数据,也不返回值。您完全误解了 yield 所做的事情。它实际上所做的是,触发一个控制流,使包含它的函数返回一个值(以一种不同于非生成器函数的特定方式)。为什么你对yield 不是一个函数如此困惑?它的行为方式显然与函数完全不同。
猜你喜欢
  • 2014-08-09
  • 2015-09-26
  • 2012-08-03
  • 2017-11-07
  • 2013-10-05
  • 2017-01-10
  • 1970-01-01
  • 2019-10-27
  • 2012-12-14
相关资源
最近更新 更多