Python ジェネレーターにおける "send" の役割を理解する
Python の "yield" キーワードを使用すると、ジェネレーターが値を生成できるようになり、呼び出し元が許可されます。ジェネレーターの出力を反復処理します。ただし、ジェネレーターは、追加の制御層を提供する「send」と呼ばれる補完関数も提供します。
「generator.send(value)」として文書化されている「send」関数を使用すると、呼び出し元は値を生成したばかりのジェネレーターに変換します。この入力値は、現在の yield 式の結果になります。重要なのは、最初にインスタンス化されるときにジェネレーター関数に渡される引数値とは異なることです。
説明のために、次のジェネレーターを考えてみましょう。
<code class="python">def double_inputs(): while True: x = yield # Pauses the generator yield x * 2 # Returns the doubled value</code>
最初に、 next(gen) を呼び出します。ジェネレーター オブジェクトの gen は、最初の yield ステートメントまで実行を進めます。この時点で、「send」関数を利用して値を入力できます。たとえば、gen.send(10) を実行すると、x が 10 に設定され、ジェネレーターが再開され、結果として 20 が生成されます。
<code class="python">gen = double_inputs() next(gen) # Pause at first yield gen.send(10) # Send input value of 10 20</code>
このプロセスを繰り返すことで、複数の入力をジェネレーターに送信できるようになります。 。この機能は、「yield」メカニズムだけでは実現できないことに注意してください。
「send」関数の実際的なアプリケーションの 1 つは、Twisted の @defer.inlineCallbacks デコレータのコンテキスト内にあります。これにより、標準の手続き型関数に似た関数を作成できますが、非同期の計算とコールバックを実行できます。
たとえば、「send」関数を使用すると、次のコードを最新化できます:
<code class="python"># Old approach with callbacks def doStuff(): returnDeferred = defer.Deferred() def gotNextResult(nextResult): returnDeferred.callback(nextResult / 10) def gotResult(result): takesTenSeconds(result * 10).addCallback(gotNextResult) takesTwoSeconds().addCallback(gotResult) return returnDeferred # New approach using @defer.inlineCallbacks @defer.inlineCallbacks def doStuff(): result = yield takesTwoSeconds() nextResult = yield takesTenSeconds(result * 10) defer.returnValue(nextResult / 10)</code>
「送信」関数の目的と機能を理解することで、開発者はより幅広いプログラミング シナリオでジェネレーターの可能性を解き放つことができます。
以上がPython の「send」関数はどのようにしてジェネレーターとの双方向通信を可能にするのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。