为什么yield函数在Python中不需要括号?

ytp*_*lai 7 python yield-keyword python-2.7 python-3.x

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

(同样,为什么return还缺少括号?)

让我添加一些东西,yield和continue也没有在许多其他语言中给出括号.我只是想知道是什么让它与保留不同.还有许多其他保留方法可以获得括号.

Nig*_*een 15

所以我去寻找答案.事实证明,有一个.从PEP 255,给我们yield关键字的pep

问:为什么新的关键词为"收益"?为什么不使用内置函数呢?

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

问:那为什么没有新关键字的其他特殊语法?例如,其中一个而不是"yield 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
Run Code Online (Sandbox Code Playgroud)

A:我错过了吗?在数百条消息中,我计算了三个建议这样的替代方案,并从中提取了上述内容.不需要一个新的关键字会更好,但更好地使收益率非常明确 - 我不希望从理解先前无意义的关键字或运算符序列中推断出收益率.尽管如此,如果这引起足够的兴趣,支持者应该坚持一个共识的建议,并且Guido会在其上发表意见.


Tig*_*kT3 8

print不是一个获得括号的函数:它从一个陈述变为一个函数.yield仍然是一个声明,像return.语法突出显示特定于您的开发环境.

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