7

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

(以类似的方式,为什么return还缺少括号?)

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

4

4 回答 4

15

所以我去挖掘答案。事实证明,有一个. 从 PEP 255 开始,给我们yield关键字的 pep

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

A. 控制流在 Python 中通过关键字更好地表达,yield 是一个控制结构。人们还认为,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:我错过了一个吗?在数百条消息中,我数了三条建议这样的替代方案,并从中提取了上述内容。不需要新的关键字会很好,但让 yield 非常清晰会更好——我不想通过理解以前无意义的关键字或运算符序列来推断出yield 正在发生。尽管如此,如果这引起了足够的兴趣,支持者应该解决一个单一的共识建议,Guido 会就此发表意见。

于 2015-07-17T03:50:24.707 回答
8

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

您可以在此处找到有关表达式和语句之间区别的更多信息,并在此处找到有关函数和语句之间区别的更多信息。另请参阅有关简单语句复合语句的文档。

于 2015-07-17T03:43:44.320 回答
2

yield不是函数,它是关键字,根据其语法它不需要括号-

yield_atom ::= "(" yield_expression ")"

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

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

于 2015-07-17T03:44:07.170 回答
1

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

于 2015-07-17T03:44:07.253 回答