“将def关键字用于生成器和函数有什么好处?”
尽管它们在机械上有所不同,但在实践中,当我使用它们时,它们在概念上通常对我实际上是相同的(我不太喜欢称呼range()
vs xrange()
)。
就快速了解功能的意义而言,我同意使用会丢失一些东西def
,但一开始不要在功能内混淆太多。
即使是隐式的,return None
也可以在长时间的条件之后混淆函数的预期行为(例如,将return None
其作为最终行为或逻辑中的监督)。但是这些只是我的想法。
我觉得我的论点并不是特别有说服力,所以我只想参考PEP 255:
问题:引入另一个新关键字(例如,“ gen”或“ generator”)代替“ def”,或以其他方式更改语法,以区分生成器功能与非生成器功能。
缺点:在实践中(您如何看待它们),生成器是
函数,但具有可恢复性的缺点。如何设置它们的技巧是一个相对较小的技术问题,并且引入新关键字将无助地过分强调发电机启动的机制(发电机生命中至关重要但很小的一部分)。
Pro:实际上(生成器的功能),生成器函数实际上是工厂函数,它们像魔术一样生成生成器迭代器。在这方面,它们与非生成器函数有根本的不同,它们的行为更像是构造函数,而不是函数,因此重用“ def”充其量是令人困惑的。掩埋在体内的“屈服”声明不足以警告语义如此不同。
BDFL:“ def”保持不变。任何一方的论点都不是完全令人信服的,因此我已经咨询了语言设计师的直觉。它告诉我,PEP中建议的语法是正确的-不太热也不是太冷。但是,就像希腊神话中的Delphi上的Oracle一样,它没有告诉我原因,因此我没有反驳PEP语法的论点。我能想到的最好的方法(除了同意反驳……已经做出的建议)是“ FUD”。如果从一开始它就已经成为语言的一部分,那么我非常怀疑这是否会使Andrew Kuchling的“ Python Warts”页面成真。