Effective Python ジェネレータ 読書メモ Part4

リストを返さずにジェネレータを返すことを考える

Effective Pythonの読書メモです。
今回は、項目16について書いていきます。

 

課題点

よくある実装で、何かの処理を行った後で、リストを返すものがあります。
それから append を使ってリストに結果を詰め込んで結果を返す、よく見られる実装です。

下記がサンプルで書かれている問題のある実装です。
問題としては、下記2点が考えられます。
①可読性が低い
②「result.append(index + 1)」の箇所が1行で2つの処理を実装していてわかりづらい

 

ジェネレータ

下記に素晴らしい記事があるので、ぜひ一読してみてください。
Pythonのイテレータとジェネレータ

上記記事より引用
【イテレータ】

・オブジェクトに対してイテレータ化が要求されたとき __iter__() メソッドが呼ばれる
・__next__()メソッドは呼ばれる度に新しい値を返す
・__next__()メソッドはもう返す値がないときの呼び出しではStopIteration例外をraiseする

【ジェネレータ】

・ジェネレータの実装ではyieldを使う
・yieldした回数だけ値が出てくる
・ジェネレータ関数ではreturnは使えない(1つの関数でyieldとreturnは同居できない)
・ジェネレータ関数を関数呼び出しするとイテレータオブジェクトになる

 

ジェネレータを使った実装

isliceに関して

確かにこれだと可読性が上がる。
メソッド内では、generatorを返して、その後にリストにしたほうがわかりやすいんだな。

 

覚えておくべきこと

①ジェネレータを使用すると、格納した結果をリストで返すよりもコードが明確になる。
②どのような長さの入力に対しても、出力のシーケンスを生成できる。