『Effective Python』の続き。みんな大好きリスト内包表記第三弾。
Effective Python: 59 Specific Ways to Write Better Python (Effective Software Development Series)
- 作者: Brett Slatkin
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2015/03/08
- メディア: ペーパーバック
- この商品を含むブログ (1件) を見る
リスト内包表記は新たなリストを生成してしまうから巨大な入力に対してはジェネレータ式を使おうぜ、という話。至極正しい。 面白いなと思ったのは、次のコード。
import random with open('/tmp/my_file.txt', 'w') as f: for _ in range(10): f.write('a' * random.randint(0, 100)) f.write('\n') it = (len(x) for x in open('/tmp/my_file.txt')) roots = ((x, x**0.5) for x in it) print(next(roots))
ジェネレータ式にジェネレータ式が!というもの。
next(roots)
とするとちゃんと内部的にnext(it)
も行われる。
ただ、イテレータにはステートフルなので気をつけろ、という話もある。 それは「Item 17: 引数によるイテレーションは防御的に行う」で1項目かけて説明している。 これに関しては筆者がサンプルを公開している。 Effective Python › Item 17: Be Defensive When Iterating Over Arguments
このサンプルを翻訳して公開しよう、という企みから単なる自己満足と化したこの一連の投稿、果たしていつまで続くのか。