Python

【Python】色々な無限イテレータを生成して使う

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