5章イテレータとジェネレータ
本章を読めば以下の問いに答えられるようになる
- ジェネレータを使うと、どのようにメモリを節約できるか?
- ジェネレータを使うべき場面はどんなときか?
- 複雑なジェネレータの処理を定義するために、どのように
itertools
を使うのか? - 遅延評価が便利な場面と、そうでないときはいつか?
Python以外の言語の経験がある人がPythonを学び始めると、for
ループの書き方が異なることに衝撃を受けます。つまり、
for (i=0; i<N; i++) { do_work(i); }
と書く代わりに、range
やxrange
という新しい関数を使って、
for i in range(N): do_work(i)
と書きます。
これら2つの関数は、ジェネレータを使うプログラミングというパラダイムを深く理解するのに役立ちます。ジェネレータを完全に理解するために、まず関数range
とxrange
を簡単に実装してみましょう。
def range(start, stop, step=1): numbers = [] while start < stop: numbers.append(start) start += step return numbers def xrange(start, stop, step=1): while start < stop: yield start ❶ start += step for i in range(0,10000): pass for i in xrange(0,10000): pass
- ❶この関数は1つの値を
return
で返すのではなく、複数の値をyield
で返します。これによって、一見ふつうの関数が、繰り返し次の値を返すジェネレータに変わるのです。 ...
Get ハイパフォーマンスPython now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.