モブプロだった人のブログ

モブプログラミングに魅了されたエンジニアのブログ

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

「Effective Python」を久しぶりに読み返して、当時は特に何も思わなかった箇所に引っかかったのでメモを残しておきますシリーズ第5弾。

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

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

ジェネレータ! あまり使ったことなかったです。

リストだとメモリを食いつぶす恐れのある処理などで使うと便利そうというのは分かっていても、なかなかその実装にまでたどり着きませんでした・・・。

実際にコードで見てみると分かりやすいですね。

def index_words(text):
    result = []
    if text:
        result.append(0)
    for index, letter in enumerate(text):
        if letter == ' ':
            result.append(index + 1)
    return result

def index_words_iter(text):
    if text:
        yield 0
    for index, letter in enumerate(text):
        if letter == ' ':
            yield index + 1

if __name__ == '__main__':
    address = 'Four score and seven years ago...'

    result = index_words(address)
    print(result)

    result = index_words_iter(address)
    print(list(result))

index_words() がリストを返すメソッドで、index_words_iter() がジェネレータを返すメソッドです。

メモリ関係の話は抜きにしても、コード自体がスッキリとして、とても見やすいですね!

今後は、リストではなくジェネレータに出来ないか、検討する時間を設けてみたいと思います。