ホームページ  >  記事  >  バックエンド開発  >  Python ジェネレーターの「send」関数の目的は何ですか?

Python ジェネレーターの「send」関数の目的は何ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-01 12:07:29257ブラウズ

What is the Purpose of the

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。