Python のジェネレーターの "send" 関数の目的を詳しく調べる
カスタム イテレーターを作成するための Python の強力なツールであるジェネレーターは、次の機能を提供するだけではありません。 yield キーワードだけでなく、あまり知られていませんが同様に重要な関数である send も使用します。ジェネレーターからの出力を提供する yield とは異なり、send を使用すると、ジェネレーターの動作をガイドする入力を導入して、実行中にジェネレーターと対話できます。
ドキュメントでは、send をジェネレーター関数に値を送信することと説明しています。 yield 式の現在の結果。これは、次に生成される値を返す yield の主な目的とは微妙に異なります。では、この矛盾は正確には何を意味するのでしょうか?
例: 送信の力を明らかにする
次のジェネレーターを考えてみましょう:
<code class="python">def double_inputs(): while True: x = yield yield x * 2</code>
このジェネレーターsend 経由で送信された値の 2 倍を生成します。ジェネレーターの実行内で send を使用すると、その動作を観察できます。
<code class="python">>>> gen = double_inputs() >>> next(gen) # Execute until the first yield >>> gen.send(10) # Send value into the generator 20 >>> next(gen) # Execute until the next yield >>> gen.send(6) 12 >>> next(gen) # Execute until the next yield >>> gen.send(94.3) 188.5999999999999</code>
send 関数がなければ、この機能は yield だけを使用して実現することは不可能です。
実際の応用: Twisted の @defer.inlineCallbacks
送信の最も魅力的な使用例の 1 つは、Twisted の @defer.inlineCallbacks と組み合わせて使用されます。このデコレータを使用すると、yield ステートメントが Deferred オブジェクトを返す非同期コードをより簡単な方法で作成できます。これらのオブジェクトは、後で計算される値を表します。
Twisted はこれらの計算を別のスレッドで実行し、結果を send 経由で関数に非同期的に渡します。これにより、コールバックと Deferred オブジェクトの力を同時に活用しながら、構造的に手続き型関数に似たコードを作成できます。
要約すると、send は実行中に入力値を導入できるようにすることで、Python ジェネレーターの機能を拡張します。これにより、double_inputs と @defer.inlineCallbacks を含む例で示されているように、より動的でインタラクティブなジェネレーターベースのコードの作成が可能になります。
以上がPython ジェネレーターの「send」関数の目的は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。