ホームページ > バックエンド開発 > Python チュートリアル > Python 3.3 ジェネレーターで Return と Yield はどのように連携しますか?

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

Mary-Kate Olsen
リリース: 2024-10-25 04:39:02
オリジナル
336 人が閲覧しました

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 コードを考えてみましょう:

<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>
ログイン後にコピー
この場合、yield from ステートメントはジェネレーター f に委譲されます。 f は値を返しますが、それ以上の yield ステートメントがないため、値 1 が出力されます。ただし、 f の yield 2 ステートメントは実行されません。

以上がPython 3.3 ジェネレーターで Return と Yield はどのように連携しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート