「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Python 3.3 ジェネレーターでは Return と Yield はどのように連携しますか?

Python 3.3 ジェネレーターでは Return と Yield はどのように連携しますか?

2024 年 11 月 1 日に公開
ブラウズ:830

How Do Return and Yield Work Together in Python 3.3 Generators?

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 ステートメントは実行されません。

リリースステートメント この記事は次の場所に転載されています: 1729747611 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3