4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonとyieldとreturnと時々yield from

Last updated at Posted at 2020-03-23

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に絞ったほうが良い。
4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?