「send」関数で Python ジェネレーターを使用する
Python のジェネレーターは、一連の値を遅延処理せずに反復処理する方法を提供します。シーケンス全体をメモリに保存します。 yield キーワードは、値を生成し、ジェネレーター関数の実行を一時停止するために使用されます。ただし、ジェネレーターの使用において重要な役割を果たす send と呼ばれる別のメソッドがあります。
「send」関数の目的
send() 関数Python ジェネレーターを使用すると、ジェネレーター関数の実行を再開し、値をジェネレーター関数に「送信」できます。この値は、現在の yield 式の結果になります。ジェネレーターによって生成された次の値を返す yield とは異なり、send() はジェネレーターに送信された値を返します。
「send」関数の理解
明確にするために、2 倍の数値のシーケンスを生成するジェネレーター関数を想像してください。 yield を使用すると、次の 2 倍の数値を取得できます。
<code class="python">def double_generator(): while True: x = yield yield x * 2</code>
ここで、このジェネレーターに値 10 を送信するとします。 send() を使用すると、次のことができます。
<code class="python">generator = double_generator() next(generator) # Initiate the generator result = generator.send(10) # Send 10 into the generator print(result) # Output: 20</code>
この例では、send() 呼び出しは生成関数を生成した時点 (x = yield) から再開し、送信された値 (10) を割り当てます。 ) を変数 x に代入し、次の yield ステートメントの結果 (yield x * 2) である 20 を返します。
実際の "send" の例
send() の使用は単純な 2 倍生成器に限定されません。これは、ジェネレーター関数に値を渡し、その実行を動的に制御する場合に特に便利です。たとえば、send() に依存する次のコードを考えてみましょう。
<code class="python">@defer.inlineCallbacks def do_something(): result1 = yield long_running_process(10) result2 = yield long_running_process(result1 * 2) defer.returnValue(result2 / 10)</code>
このコードは、Twisted の @defer.inlineCallbacks デコレータを使用しています。これにより、非同期コードを同期しているかのように記述できます。ここで、long_running_process() は、完了するまでに時間がかかり、Deferred を返す関数です。
do_something() が実行されると、ジェネレーター関数に値が送信されます。たとえば、最初のyieldの後、long_running_process(10)によって返されたDeferredが解決されるまで実行は一時停止します。 Deferred の結果はジェネレーターに送り返され、そこで変数 result1 に割り当てられます。
この動的なフローにより、より複雑な非同期コードをより直接的な方法で記述することができるため、 Python で非同期プロセスを操作します。
以上が「send」関数は Python ジェネレーターでどのように機能しますか?また、その実際の用途は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。