ホームページ  >  記事  >  バックエンド開発  >  Return は Python 3.3 のジェネレーターの動作にどのような影響を与えますか?

Return は Python 3.3 のジェネレーターの動作にどのような影響を与えますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-24 17:16:02786ブラウズ

How does Return Affect Generator Behavior in Python 3.3?

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 つの重要な側面があります:

  • StopIteration が発生する: ジェネレーター関数内の return ステートメントは、StopIteration() を発生させるのと同等になります。
  • 例外経由でアクセス可能な値: 戻り値 (この場合は 3) は、例外オブジェクトの value 属性を通じてアクセスできます。

したがって、ジェネレーター関数には 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。