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】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

7か月 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

7か月 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

7か月 ago

【Unity】割合から数値に数値から割合に変換する

この記事では、割合から数値に変換する関数…

7か月 ago

【Python】抽象クラスを定義する方法

この記事では、Pythonで抽象クラスを…

7か月 ago