Pythonでは、関数内で yield
を使うとジェネレータとして使えます。例えば、次のように書くと、0から9までの値が表示されます。
def foo():
for i in range(10):
yield i
for k in foo():
print(k)
また、yield
と return
を併用した場合、yield
の結果のみが返されます。これはPythonの仕様で、ジェネレータ内での return
は StopIteration
として扱われます。したがって、基本的に yield
と return
の併用は難しいと考えても差し支えありません。
しかし、何か理由があって 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
を使えばジェネレータを生成できるyield
とreturn
の併用は厳しいyield from
を使えばreturn
の値までを取得ができるyield from
は関数内でしか使えない- 結局は
yield
かreturn
に絞ったほうが良い