4

我想知道,在阅读了“改进你的 Python:'yield' 和生成器解释”中的生成器之后,但还没有尝试过它们,为什么生成器函数的语法符号与常规函数的语法符号没有什么不同。在我的思想实验中,最明显的选择是:

generator generator_name(param):
    # ...
    yield some_other_value

代替:

def generator_name(param):
    # ...
    yield some_value

现在,在阅读 Python 代码时,似乎需要先搜索“yield”这个词,然后才能理解某个函数是生成器函数。或者,是否存在要求生成器函数具有指示性名称的 Python 约定?喜欢generate_some_value_from_y

4

1 回答 1

7

引用PEP 255,将生成器引入 Python 的提案,Guido van Rossum(仁慈的生命独裁者,BDFL)解释了为什么没有单独的关键字:

问题:引入另一个新关键字(例如,gengenerator)代替def,或以其他方式更改语法,以区分生成器函数和非生成器函数。

缺点:在实践中(您如何看待它们),生成器函数,但它们是可恢复的。它们的设置机制是一个相对较小的技术问题,引入一个新关键字将无益地过分强调生成器如何启动的机制(生成器生命中至关重要但很小的一部分)。

Pro:实际上(您如何看待它们),生成器函数实际上是工厂函数,它们像魔术一样生成生成器迭代器。在这方面,它们与非生成器函数完全不同,更像是构造函数而不是函数,因此重用def充其量是令人困惑的。埋在正文中的yield声明不足以警告语义如此不同。

BDFLdef它保持不变。任何一方的论点都没有完全令人信服的,所以我咨询了我的语言设计者的直觉。它告诉我 PEP 中提出的语法是完全正确的——不太热,也不太冷。但是,就像希腊神话中德尔福的甲骨文一样,它没有告诉我为什么,所以我对反对 PEP 语法的论点没有反驳。我能想到的最好的(除了同意反驳......已经提出)是“FUD”。如果从第一天起这就是语言的一部分,我非常怀疑它会成为 Andrew Kuchling 的“Python Warts”页面。

本质上,一个生成器函数产生一个生成器,它本身不是一个生成器。

于 2013-11-24T23:34:04.943 回答