Pythonでのyield
Pythonでは関数内でyield
を使うとGeneratorとして使える。
例えば
def foo():
for i in range(10):
yield i
として書いて、
for k in foo():
print(k)
と書くと0から9までの値が表示される。
Pythonでのyieldとreturnの併用
例えば、
def hoge():
for i in range(10):
yield i
return i+1
みたいに書いた時、これを実行した場合には yield の結果のみが帰ってくる。
これはPythonの仕様であって、Generator内におけるreturnはStopIteration
として扱われているのが理由。
なので、基本的にyieldとreturnの併用というのは難しい、と考えても差し支えはない。
むしろ、yieldがGenerator内においてはreturnとしての機能を果たすので、基本的には
yieldかreturnのどちらかに絞るのが良い。
無理してでも併用する
何か理由があってreturnと併用したい場合には、yield from
を使えばreturnに設定した値を取得する
ことが出来るようになる。
例えば、
def buzz():
i = 0
for j in range(10):
i += j
yield j
return i
のような関数を書いたとして、returnまで欲しい場合には別個に新たな関数を用意して次のように
書いてあげるとreturnの値まで取得ができる。
def getter():
x = yield from buzz()
yield x
ただし、 yield from
は関数内でしか記述できない手法なのでそこは注意しなければならない。
まとめ
- yield を使えばGeneratorを生成できる
- yield と return の併用は厳しい
- yield fromを使えばreturnの値までを取得が出来る。
- yield fromは関数内でしか使えない
- 結局はyieldかreturnに絞ったほうが良い。