7

yieldPython では、ジェネレーターを作成するために使用される関数を何度も見てきました。this とprint関数はどちらも、技術的にはどちらも値を返すため、メソッドのアクションを実行します。ただし、Python 2 から Python 3 への変更中に、print関数は通常のメソッド呼び出しのように括弧を取得しましたが、yield は同じままでした。また、は予約済みメソッドの紫ですが、yield予約済みキーワードは黄色がかった色になります。メソッドと見なされず、括弧構文を使用しないのにこのように色付けされているのprintはなぜですか?yield

(同様に、なぜ にreturnも括弧がないのですか?)

いくつか追加させてください。yield と continue には、他の多くの言語でも括弧が付けられていません。予約されている以外に何が違うのか知りたかっただけです。括弧を取得する他の多くの予約済みメソッドがあります。

4

4 に答える 4

15

だから私は答えを探しに行きました。そして、1つあることがわかりましたyieldPEP 255 から、キーワードを与えたペップ

Q. なぜ「利回り」の新しいキーワードを?代わりに組み込み関数を使用しないのはなぜですか?

A. Python では、制御フローはキーワードを介してより適切に表現されます。yield は制御構造です。また、Jython で効率的に実装するには、コンパイラがコンパイル時に潜在的な中断ポイントを判断できる必要があると考えられており、新しいキーワードによってそれが容易になります。CPython 参照実装も、どの関数ジェネレーター関数であるかを検出するために、それを大いに活用しています (ただし、「def」の代わりに新しいキーワードを使用すると、CPython の場合は解決されますが、「なぜ新しいキーワードを使用するのか?」という質問をする人はそうしません)。新しいキーワードが欲しい)。

Q: では、new キーワードを使用しない他の特別な構文を使用しないのはなぜですか? たとえば、「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

A: 1 つ聞き逃しましたか? 何百ものメッセージの中から、そのような代替案を示唆するものを 3 つ数え、それらから上記を抽出しました。新しいキーワードを必要としないのは良いことですが、yield を非常に明確にする方が良いでしょう。以前は無意味だったキーワードや演算子のシーケンスを理解することで、yield が発生していると推測する必要はありません。それでも、これが十分な関心を集めた場合、支持者は単一のコンセンサス提案に落ち着くべきであり、Guido はそれを発音します。

于 2015-07-17T03:50:24.707 に答える
8

printかっこを取得した関数ではありませんでした。ステートメントから関数になりました。yieldのように、まだステートメントですreturn。構文の強調表示は、開発環境に固有です。

式とステートメントの違いの詳細については、こちらを参照してください。関数とステートメントの違いの詳細については、こちらを参照してください。単純なステートメント複合ステートメントに関するドキュメントも参照してください。

于 2015-07-17T03:43:44.320 に答える
2

yieldは関数ではなく、キーワードであり、文法に従って括弧は必要ありません-

yield_atom ::= "(" yield_expression ")"

収量式 ::= "収量" [式リスト]

printPython 2 ではステートメントでしたが、 PEP 3105を使用して Python 3 で組み込み関数に変更されました。

于 2015-07-17T03:44:07.170 に答える
1

printはPython 2の言語仕様で定義されたキーワードであり、組み込み関数 (標準ライブラリ仕様で定義) Python 3になりましyield

于 2015-07-17T03:44:07.253 に答える