ホームページ > バックエンド開発 > Python チュートリアル > 「send」関数は Python ジェネレーターでどのように機能しますか?また、その実際の用途は何ですか?

「send」関数は Python ジェネレーターでどのように機能しますか?また、その実際の用途は何ですか?

DDD
リリース: 2024-11-01 13:16:02
オリジナル
404 人が閲覧しました

How does the

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

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