mutomasa ブログ

浅学非才、継続は力なり

Pythonのyieldを使ってみる

きっかけ

Rubyではyieldを使って、ブロック変数に値を渡すために使っていたが、Pythonではyieldを使ったことがなかったので簡単に使ってみる。

yieldのメリットを実感したのは、『Python 機械学習プログラミング』という本の中に、以下のようなyieldを使ったコードに出くわしたときでした。文章全体を読み込んで返すとなると、メモリーを大量に使用するのを避けるためか、このyieldで一文ずつ読むように実装されている。別な章では、バッチ処理でyieldを使い、オンライン学習の更新に使用していた。

f:id:muto_masa:20201008113106p:plain

 

さて、自分で階乗を求めるコードをyieldで作ってみる。

再帰関数のケースとyieldを使ったケースを書く。

(1) 再帰関数のコード。5!=120である。ちなみに3000!を求めると、このようなエラーになる。RecursionError: maximum recursion depth exceeded in comparison

再帰する深さの最大値を超えてしまったようだ。

f:id:muto_masa:20201008100748p:plain

 

(2) yieldを使ったコード

yieldを含んだ関数をジェネレーター関数といって、その関数を使ってジェネレーターを生成する。

f:id:muto_masa:20201008101553p:plain

再帰関数でエラーになった3000!はエラーにならない。スタックに関数が詰まれないからという理屈かな。

f:id:muto_masa:20201008101741p:plain


以上、簡単なyieldの使用レポートでした。