Python ジェネレーターで Return と Yield を一緒に使用する
Python 2 では、yield も使用したジェネレーター関数内の return ステートメントは次のようになります。エラーです。ただし、Python 3.3 では、微妙な変更が発生しました。
コードのデモ
次の Python 3.3 コードを考えてみましょう:
def f():
return 3
yield 2
x = f()
print(x.__next__())
解説
このコードでは、関数 f に return ステートメントと yield ステートメントの両方が含まれています。関数が呼び出されると、最初に return ステートメントが実行され、値 3 が返されます。その結果、yield ステートメントは実行されません。
ジェネレーター x が next メソッドを呼び出して反復されると、値 3 で StopIteration 例外が発生します。これは、ジェネレータのイテレータは使い尽くされており、return ステートメントによって返された値は例外の value 属性として利用できます。
Python 3.3 の新しいメカニズム
PEP 380 による、この動作は Python 3.3 で導入された新機能です。これは、次のように記述することと同じです:
def f():
yield 3
raise StopIteration
Yield from
の例次の例は、この動作が、yield from 構文を使用して委任されたジェネレーターにどのような影響を与えるかを示しています:
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
この場合、yield from ステートメントはジェネレーター f に委譲されます。 f は値を返しますが、それ以上の yield ステートメントがないため、値 1 が出力されます。ただし、f の yield 2 ステートメントは実行されません。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3