この記事では、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%