5章イテレータとジェネレータ

本章を読めば以下の問いに答えられるようになる
  • ジェネレータを使うと、どのようにメモリを節約できるか?
  • ジェネレータを使うべき場面はどんなときか?
  • 複雑なジェネレータの処理を定義するために、どのようにitertoolsを使うのか?
  • 遅延評価が便利な場面と、そうでないときはいつか?

Python以外の言語の経験がある人がPythonを学び始めると、forループの書き方が異なることに衝撃を受けます。つまり、

for (i=0; i<N; i++) {
    do_work(i);
}

と書く代わりに、rangexrangeという新しい関数を使って、

for i in range(N):
    do_work(i)

と書きます。

これら2つの関数は、ジェネレータを使うプログラミングというパラダイムを深く理解するのに役立ちます。ジェネレータを完全に理解するために、まず関数rangexrangeを簡単に実装してみましょう。

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. この関数は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.