Pythonのyieldについて

Python Published at Feb. 12, 2025, 1:18 a.m. by admin@senrigan.org

yield curveの利回り曲線とはちょっと違うし、yieldって金融商品の利益を生み出すとか、農作物の収穫をもたらすとかいう意味だから、softwareと全然馴染みがないと思っちゃうからなかなか理解できない。金融商品とか農作物のことは忘れて、yieldは生み出す、もたらす、生産するみたいな意味と捉えればいい。Pythonでのyieldはジェネレータ関数を作るときに密接に関係があるので。

ジェネレータ関数ではreturnのかわりにyieldで返すので、returnみたいなものと考えればいい。 ふつうの関数は一度実行されたら終了するけど、yieldを使ってジェネレータ関数を作ると、関数の状態を保持したまま中断したり再開したりできる。

>>> def my_range(first=0, last=0, step=1):
...     number = first
...     while number < last:
...         yield number
...         number += step
... 
>>> ranger = my_range(1,5)
>>> ranger
<generator object my_range at 0x7bae1e7edff0>
>>> for x in ranger:
...     print(x)
... 
1
2
3
4
>>>

こんな感じでジェネレータで生成したオブジェクトに対して反復処理できる。

または、

>>> def countdown(num):
...     for i in range(1, num):
...         yield i
... 
>>> g = countdown(5)
>>> print(next(g))
1
>>> print(next(g))
2
>>> print(next(g))
3
>>> print(next(g))
4
>>> print(next(g))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

指定した範囲を超えて反復処理しようとすると、すでに中身は空なので例外になる。

何にこんなのを使うのかと思うけど、全部を一度に作ってメモリに格納しなくていいのでメモリ効率がよかったり、遅延評価で非同期処理できる。