\

Pythonでは、関数内で yield を使うとジェネレータとして使えます。例えば、次のように書くと、0から9までの値が表示されます。

def foo():
    for i in range(10):
        yield i

for k in foo():
    print(k)

また、yieldreturn を併用した場合、yield の結果のみが返されます。これはPythonの仕様で、ジェネレータ内での returnStopIteration として扱われます。したがって、基本的に yieldreturn の併用は難しいと考えても差し支えありません。

しかし、何か理由があって return と併用したい場合には、 yield from を使えば return に設定した値を取得することができます。例えば、次のような関数を書いたとして、return まで欲しい場合には別個に新たな関数を用意して次のように書くと return の値まで取得ができます。

def buzz():
    i = 0
    for j in range(10):
        i += j
        yield j
    return i

def getter():
    x = yield from buzz()
    yield x

ただし、 yield from は関数内でしか記述できない手法なので注意が必要です。

まとめとして、以下の点を覚えておきましょう。

  • yield を使えばジェネレータを生成できる
  • yieldreturn の併用は厳しい
  • yield from を使えば return の値までを取得ができる
  • yield from は関数内でしか使えない
  • 結局は yieldreturn に絞ったほうが良い

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です