Python ジェネレーターで Return と Yield を一緒に使用する
Python 2 では、yield も使用したジェネレーター関数内の return ステートメントは次のようになります。エラーです。ただし、Python 3.3 では、微妙な変更が発生しました。
コードのデモ
次の Python 3.3 コードを考えてみましょう:
<code class="python">def f(): return 3 yield 2 x = f() print(x.__next__())</code>
説明
このコードでは、関数 f に return ステートメントと yield ステートメントの両方が含まれています。関数が呼び出されると、最初に return ステートメントが実行され、値 3 が返されます。その結果、yield ステートメントは実行されません。
ジェネレーター x が next メソッドを呼び出して反復されると、値 3 で StopIteration 例外が発生します。これは、ジェネレータのイテレータはすべて枯渇しており、return ステートメントによって返された値は例外の value 属性として利用できます。
Python 3.3 の新しいメカニズム
PEP 380 による、この動作は Python 3.3 で導入された新機能です。これは、次のように記述することと同じです。
<code class="python">def f(): yield 3 raise StopIteration</code>
Yield from
の例 次の例は、この動作が、yield from 構文を使用して委任されたジェネレーターにどのような影響を与えるかを示しています。
<code class="python">def f(): return 1 yield 2 def g(): x = yield from f() print(x) # g is still a generator so we need to iterate to run it: for _ in g(): pass</code>
以上がPython 3.3 ジェネレーターで Return と Yield はどのように連携しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。