Python PR

【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%