「ジェネレータと関数の両方にdefキーワードを使用するメリットは何ですか?」
それらは機械的に異なりますが、実際に私がそれらを使用する場合、それらは概念的には事実上同じであることがよくあります(range()
vs を呼び出すことについてはあまり考えていませんxrange()
)。
関数の内容をすばやく理解するという観点からは、を使用すると何かが失われることに同意しますがdef
、関数内で物事が難読化されすぎてはいけません。
暗黙的であっても、return None
長い条件文の後に関数の意図された動作を混乱させる可能性があります(return None
最終的な動作またはロジックの見落としとして意図されていたように)。しかし、それらはそれについての私の信念にすぎません。
私の主張は特に説得力があるとは思わないので、私はPEP 255をそのまま使用します。
問題:「def」の代わりに別の新しいキーワード(たとえば、「gen」または「generator」)を導入するか、構文を変更して、ジェネレーター関数と非ジェネレーター関数を区別します。
短所:実際には(あなたがそれらについてどう思うか)、ジェネレーターは
関数ですが、ひねりを加えて再開可能です。それらがどのように設定されるかのメカニズムは比較的小さな技術的な問題であり、新しいキーワードを導入することは、ジェネレーターがどのように開始されるかのメカニズム(ジェネレーターの人生の重要な、しかしごく一部)を過度に強調するのに役立ちます。
プロ:実際には(あなたがどう思うか)、ジェネレーター関数は実際にはまるで魔法のようにジェネレーターイテレーターを生成するファクトリー関数です。この点で、それらは非ジェネレーター関数とは根本的に異なり、関数よりもコンストラクターのように振る舞うので、「def」を再利用することはせいぜい混乱するだけです。体内に埋め込まれた「収量」ステートメントは、セマンティクスが非常に異なることを示す十分な警告ではありません。
BDFL:「def」が残ります。どちらの議論も完全に説得力があるわけではないので、言語デザイナーの直感に相談しました。PEPで提案されている構文は正確であり、暑すぎず、寒すぎないことがわかります。しかし、ギリシャ神話に登場するDelphiのOracleのように、その理由はわかりません。そのため、PEP構文に対する引数に対する反論はありません。私が思いつくことができる最高の(反論に同意することを除いて...すでに作られた)は "FUD"です。これが最初から言語の一部だったとしたら、それがAndrew Kuchlingの「Python Warts」ページになったのではないかと私は大いに疑っています。