この記事では、Pythonで無限イテレータを生成して使う方法を解説します。無限イテレータはitertoolsモジュールに以下のような3つが用意されています。
| count() | 任意の値からのカウントを返す無限イテレータ |
|---|---|
| cycle() | 任意のイテラブルの要素を無限に返すイテレータ |
| repeat() | 任意のオブジェクトを無限に返すイテレータ |
それでは、それぞれの使い方を見ていきましょう。
スポンサーリンク
カウントを返す無限イテレータ
itertools.count() は、任意の値から無限にカウントするイテレータを生成します。
import itertools itertools.count(start=0, step=1)
start引数 から始まる step幅 のカウント値を無限に返します。
import itertools for i in itertools.count(10, 2): print(i)
実行結果
10 12 14 16 ...省略
map() や zip() なんかと組み合わせてよく使われる。
import itertools names = ['田中', '山田', '佐藤'] for i, name in zip(itertools.count(1), names): print(i, name)
実行結果
1 田中 2 山田 3 佐藤
また、Python 3.1 から小数を扱うことも可能になった。
import itertools for i in itertools.count(0.5, 0.5): print(i)
実行結果
0.5 1.0 1.5 2.0 ...省略
繰り返しイテラブルの要素を返す無限イテレータ
itertools.cycle() は、イテラブルの要素を繰り返し返す無限イテレータを生成します。
import itertools itertools.cycle(iterable)
引数に指定されたイテラブルが内部でコピーされ、2回目からはコピーされたイテラブルの要素が返されます。
import itertools values = [1, 2, 3] for value in itertools.cycle(values): print(value)
実行結果
1 2 3 1 2 3 ...省略
内部でイテラブルを複製しているのでメモリをかなり消費する。大きなイテラブルを使用する場合は注意しましょう。
任意のオブジェクトを返す無限イテレータ
itertools.repeat() は、任意のオブジェクトを返す無限イテレータを生成します。
import itertools itertools.repeat(object[, times])
object引数 に指定したオブジェクト無限に返されます。
import itertools for obj in itertools.repeat(10): print(obj)
実行結果
10 10 10 ...省略
times引数 を指定することでオブジェクトを返す回数を設定できます。
import itertools for obj in itertools.repeat(10, 3): print(obj)
実行結果
10 10 10
map関数 や zip関数 を扱う際に同じ引数を与える場合に使います。
以下のコードでは、itertools.repeat('%') を使って同じフォーマット形式を指定し、小数をパーセントに整形しています。
import itertools for s in map(format, [0.1, 0.75, 1.0], itertools.repeat('%')): print(s)
実行結果
10.000000% 75.000000% 100.000000%


