Categories: 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%
ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

View Comments

    Recent Posts

    【Python】yield from の使い方

    この記事では、yield fromの使い…

    3日 ago

    【Unity】BGMやSEを再生する方法

    この記事では、UnityでBGMやSEな…

    2週間 ago

    【Unity】オブジェクトが見えているかどうかを判別する方法

    この記事では、特定のオブジェクトがカメラ…

    3週間 ago

    【Unity】アセットストアにあるアセットを追加・使用する方法

    この記事では、Unityのアセットストア…

    4週間 ago

    【Unity】値が変更された際に処理を実行したい

    この記事では、値が変更された際に何かしら…

    4週間 ago

    【Unity】クラスのパラメータをインスペクターから調整したい

    この記事では、定義したクラスをインスペク…

    1か月 ago