Yield を使用したジェネレーター内のリターン
Python 3.3 では、ジェネレーター関数内での yield と並行した return の使用に関して重要な変更が導入されました。このようなコードがエラーを引き起こす Python 2 とは異なり、Python 3.3 ではそれが可能です。ただし、その動作は予想とは異なります。
次の Python 3.3 コードを考えてみましょう:
<code class="python">def f(): return 3 yield 2 x = f() print(x.__next__())</code>
このコードを実行すると、例外がスローされることがわかります: StopIteration: 3. この例外には 2 つの重要な側面があります:
したがって、ジェネレーター関数には return と yield の両方が含まれており、指定された戻り値で StopIteration 例外を発生させるのと似ています。これは、ジェネレータが終了し、戻り値が例外の value 属性を通じて利用できるようになるということを意味します。
言い換えると、ジェネレータ関数の return は以前はエラーでしたが、現在は特定の目的を持っています。ジェネレーターを終了し、例外処理メカニズムを通じて値を返します。
この動作は、Python 3.3 の新しい yield from 構文を使用するジェネレーターの委任に影響します。例:
<code class="python">def f(): return 1 yield 2 def g(): x = yield from f() print(x) # Iterate over generator to run it for _ in g(): pass</code>
このコードでは、ジェネレーター f は 1 を返し、ジェネレーター g に委譲し、ジェネレーター g は戻り値を出力します。ただし、出力されるのは 1 だけです。これは、f の yield ステートメントが値 2 を生成する前に、yield ステートメントが委任を停止することを示します。
以上がReturn は Python 3.3 のジェネレーターの動作にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。