Python の「send」関数はどのようにしてジェネレーターとの双方向通信を可能にするのでしょうか?

Linda Hamilton
リリース: 2024-11-02 19:12:30
オリジナル
394 人が閲覧しました

How does Python's `send` function allow for two-way communication with generators?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート