Python itertoolsで無限ループを賢く制御!count, cycle, repeat入門
この記事では、Pythonの標準ライブラリ**itertoolsモジュールが提供する無限イテレータであるcount、cycle、repeat**の使い方について解説します。これらの関数を使うことで、無限に続く数値シーケンス、繰り返し要素、あるいは指定回数繰り返される要素を効率的に生成でき、特定の処理やテストシナリオなどで非常に役立ちます。
無限イテレータとは?
無限イテレータとは、その名の通り、要素を無限に生成し続けるイテレータのことです。通常のリストやタプルとは異なり、全ての要素をメモリに保持するわけではないため、非常に効率的です。無限イテレータは、特定の条件が満たされるまで処理を続けたい場合や、要素の供給が無限であるかのように振る舞わせたい場合に利用されます。
なぜ無限イテレータを使うのか?
-
リソース効率: 全ての要素を事前に生成・保存する必要がないため、メモリを節約できます。
-
柔軟な処理: 終わりのないデータストリームをシミュレートしたり、テストデータジェネレータとして使ったりできます。
-
簡潔なコード: ループカウンターやインデックス管理の手間を省き、コードを簡潔に記述できます。
itertools.count():無限の連番を生成
itertools.count()は、指定した開始値から始まる無限の連番(整数)を生成します。オプションでステップ(増加量)も指定できます。
基本的な使い方
開始値を指定して無限の連番を生成します。
import itertools
# 0から始まる無限の連番
for i in itertools.count():
print(i)
if i >= 5: # 無限ループなので終了条件を設ける
break
# 出力: 0, 1, 2, 3, 4, 5
開始値とステップを指定する
start引数で開始値を、step引数で増加量を指定できます。
import itertools
# 10から始まり、2ずつ増える連番
for i in itertools.count(start=10, step=2):
print(i)
if i >= 20:
break
# 出力: 10, 12, 14, 16, 18, 20
itertools.cycle():要素を無限に循環
itertools.cycle()は、与えられたイテラブル(リストやタプルなど)の要素を無限に繰り返し生成します。
基本的な使い方
リストの要素を繰り返し出力します。
import itertools
colors = ['red', 'green', 'blue']
# colorsの要素を無限に循環
count = 0
for color in itertools.cycle(colors):
print(color)
count += 1
if count >= 7: # 無限ループなので終了条件を設ける
break
# 出力: red, green, blue, red, green, blue, red
特定の処理を循環させる
複数の処理や状態を順番に切り替えたい場合にも便利です。
import itertools
import time
tasks = ['Download', 'Process', 'Upload']
for task in itertools.cycle(tasks):
print(f"現在実行中のタスク: {task}")
time.sleep(0.5) # 処理をシミュレート
if task == 'Upload' and time.time() > time.time() + 2: # 適当な終了条件
break
if input("続けますか? (y/n): ") != 'y':
break
itertools.repeat():要素を無限または指定回数繰り返す
itertools.repeat()は、指定した単一の要素を無限に、または指定した回数だけ繰り返し生成します。
無限に要素を繰り返す
times引数を省略すると、要素を無限に繰り返します。
import itertools
# 'Hello'を無限に繰り返す
count = 0
for s in itertools.repeat('Hello'):
print(s)
count += 1
if count >= 3: # 無限ループなので終了条件を設ける
break
# 出力: Hello, Hello, Hello
指定回数だけ要素を繰り返す
times引数に回数を指定すると、その回数だけ要素を生成します。
import itertools
# 0を5回繰り返す
for i in itertools.repeat(0, times=5):
print(i)
# 出力: 0, 0, 0, 0, 0
これは、同じ値を複数回リストに含めたいが、メモリ効率を重視したい場合に特に役立ちます。
まとめ
itertoolsモジュールのcount()、cycle()、repeat()は、Pythonで無限のシーケンスや繰り返し要素を効率的に扱うための強力なツールです。これらの無限イテレータを適切に利用することで、メモリ使用量を抑えつつ、柔軟かつ簡潔なコードで様々な処理を実現できます。ぜひこれらの関数を活用して、Pythonプログラミングをよりスマートにしてみてください!
itertoolsには他にも便利な関数がたくさんあります。例えば、複数のイテレータを連結するchain()や、組み合わせを生成するcombinations()などがあります。もし、他のitertoolsの機能についても知りたい場合は、お気軽にお尋ねください!
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座


