以下を検討してください。
def some_function():
return 1
def some_generator():
yield 1
上記のコードでは、some_function
は関数ですが、some_generator
はジェネレーターです。それらは非常によく似ています。
コードを読み取るときに発生する問題は、「関数」のすべての行をスキャンしてyield
キーワードを探し、実際に関数なのかジェネレータなのかを判断する必要があることです。
ジェネレーターに別のキーワードを使用する方が理にかなっているように思えます、例えば:
gen some_generator():
yield 1
ジェネレータと関数の両方にdef
キーワードを使用するメリットは何ですか?関数とジェネレータを分離するために新しいキーワードが導入されていないのはなぜですか?
「ジェネレータと関数の両方に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」ページになったのではないかと非常に疑っています。
新しいキーワードを追加すると、既存のプログラムが壊れるリスクがあります。言語デザイナーは、特に言語がすでに人気を得た後に追加された言語機能の場合、新しいキーワードを追加しないようにします。追加するすべてのキーワードは、プログラムが他の目的で使用することを許可されていない識別子であるため、キーワードを追加すると既存のプログラムが壊れる可能性があります。言語設計者は、新しいキーワードの利点とコストを比較検討する必要があります。
definingジェネレータ用の個別のキーワードが多くの利点をもたらすとは思えませんシンボルが名前に対応するかどうかを理解するには関数またはジェネレーターの名前は、呼び出し元にとって重要なものであり、呼び出し元は、それを実装するために使用されたキーワードを調べる必要がない(場合によってはできない)必要があります。これは、より良い命名規則とドキュメントの責任です。
ジェネレータは、遅延評価する関数です。それらは基本的に同じものであることを考えると、同じキーワードを使用することは理にかなっています。 1つのオプションは、コメントを使用して、特定のインスタンスのどれがどれであるかを識別することです。
def some_function(): #This is a function.
return 1
def some_generator(): #This is a generator.
yield 1
私はそれがよりPythonicであるからだと思いますが、私は何を知っていますか? ;)
そんなに大事なことだとは思いません。両方を覚える必要がないので、覚えやすいです。
編集:PEPは言うかもしれません、あなたはそこで調査することができます。