Python 3.3 の "yield from" の威力
Python 3.3 では、"yield from" 構文が導入され、プログラミングに革新的なアプローチがもたらされました。ジェネレーターとコルーチンを使用します。通常のジェネレーターと似ていますが、yield from は呼び出し元とサブジェネレーターの間に直接接続を確立し、シームレスな双方向通信を可能にします。
1.ジェネレーターからのデータの読み取り
最も単純な使用例は、ジェネレーターからのデータの読み取りです。 yield from を使用すると、通常のループと同様に、簡略化された構文でジェネレーターから値を受け取ることができます。
たとえば、データの読み取りをシミュレートするジェネレーターを考えてみましょう。
<code class="python">def reader(): for i in range(4): yield '<< %s' % i
Usingから得られる場合、次のようにデータを反復処理できます:
<code class="python">def reader_wrapper(g): yield from g wrap = reader_wrapper(reader()) for i in wrap: print(i)
2.コルーチンへのデータの送信
は、データをコルーチンに送信するときに輝きます。 yield from を使用すると、ラッパーに送信されたデータは透過的にコルーチンに転送されます。
特定の宛先にデータを書き込むコルーチンを考えてみましょう:
<code class="python">def writer(): while True: w = (yield) print('>> ', w)</code>
yield を使用してこのライターにデータを送信するにはから:
<code class="python">def writer_wrapper(coro): coro.send(None) while True: try: x = (yield) coro.send(x) except StopIteration: pass w = writer() wrap = writer_wrapper(w) wrap.send(None) for i in range(4): wrap.send(i)</code>
3.例外処理
は例外をシームレスに処理します。サブジェネレーターで発生した例外は呼び出し元に伝播されます。さらに、ラッパーに送信された例外をサブジェネレーターにスローできます。
たとえば、ライター コルーチンでは:
<code class="python">def writer(): while True: try: w = (yield) except SpamException: print('***') else: print('>> ', w)</code>
yield from を使用すると、次のように例外を処理できます。 :
<code class="python">def writer_wrapper(coro): yield from coro</code>
4.双方向通信の力
yield from の重要な側面は、確立される双方向接続です。データをコルーチンに送信するだけでなく、例外を伝播し、サブジェネレーターの最終値を返すこともできます。
結論
yield from は強力なツールですそれは Python のジェネレーターとコルーチンに革命をもたらしました。双方向通信を簡素化し、例外をシームレスに処理し、洗練されたソリューションを可能にします。そのユースケースはここで説明した例をはるかに超えており、Python の多くの高度なプログラミング タスクに不可欠なコンポーネントとなっています。
以上が双方向通信の力を解き放つ: 「yield from」は Python 3.3 に何をもたらしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。