『Effective Python』の続き。ジェネレータ便利みんな使おう。 www.effectivepython.com
まだ翻訳したのはItem 16までであるが、『Effective Python』には大きく2つのテーマがあると思う。
- ビジュアルノイズを減らせ
- メモリ不足を防ぐ
ただ単に、この2つの要素が複数回目に入っただけでもしかしたら別のテーマが根底にある、たとえば、Zen of Pythonとか、かもしれない。 特に 1 はZen of Pythonっぽいことがらである。
この「Item 16: リストを返す代わりにジェネレータを検討しよう」は2つのテーマを考える好例である。 文字列が与えられたときに各単語の開始位置のインデックスを調べたい、という状況があったときに、よく次のようなコードを書く。
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
このコードは各単語の開始位置のインデックスを調べたい、という知りたいことだけを削り出している。かなり綺麗なコードである。 中々感動的な改良である。勿論、必要ならば簡単にリストに変換できるので機能面でも不足がないどころかメモリの問題も回避している。 本当に素晴らしい例である。