きっかけ
Rubyではyieldを使って、ブロック変数に値を渡すために使っていたが、Pythonではyieldを使ったことがなかったので簡単に使ってみる。
yieldのメリットを実感したのは、『Python 機械学習プログラミング』という本の中に、以下のようなyieldを使ったコードに出くわしたときでした。文章全体を読み込んで返すとなると、メモリーを大量に使用するのを避けるためか、このyieldで一文ずつ読むように実装されている。別な章では、バッチ処理でyieldを使い、オンライン学習の更新に使用していた。
さて、自分で階乗を求めるコードをyieldで作ってみる。
再帰関数のケースとyieldを使ったケースを書く。
(1) 再帰関数のコード。5!=120である。ちなみに3000!を求めると、このようなエラーになる。RecursionError: maximum recursion depth exceeded in comparison
再帰する深さの最大値を超えてしまったようだ。
(2) yieldを使ったコード
yieldを含んだ関数をジェネレーター関数といって、その関数を使ってジェネレーターを生成する。
再帰関数でエラーになった3000!はエラーにならない。スタックに関数が詰まれないからという理屈かな。
以上、簡単なyieldの使用レポートでした。