Pythonでプログラムを書いていると、処理を永続的に繰り返したい場面が出てきます。サーバーの常時稼働・メニュー画面のループ・センサーデータの継続的な取得など、無限ループはPythonプログラミングの重要なパターンのひとつです。
Pythonで無限ループを書く方法はいくつかあります。while Trueが最もよく使われる書き方ですが、while 1も同じ動作をします。breakでループを抜ける制御・continueでスキップする方法・例外処理との組み合わせなど、無限ループを安全に使いこなすための知識を合わせて押さえておきましょう。
この記事では、Pythonのwhile 1とwhile Trueの違いから、無限ループの書き方・breakによるループ制御・実践的な応用パターンまで、サンプルコードとともにわかりやすく解説していきます。
Pythonのwhile 1はwhile Trueと同じ動作をする無限ループの書き方
それではまず、while 1とwhile Trueの基本的な仕組みと違いについて解説していきます。
Pythonのwhile文は「条件が真(True)である間ループを繰り返す」という構文です。while 1もwhile Trueも条件が常に真になるため、どちらも無限ループとして動作します。
# while Trueによる無限ループ(推奨)
count = 0
while True:
count += 1
print(f"while True:{count}回目")
if count >= 3:
break
print("---")
# while 1による無限ループ(同じ動作)
count = 0
while 1:
count += 1
print(f"while 1:{count}回目")
if count >= 3:
break
# 出力結果:while True:1回目
# 出力結果:while True:2回目
# 出力結果:while True:3回目
# 出力結果:---
# 出力結果:while 1:1回目
# 出力結果:while 1:2回目
# 出力結果:while 1:3回目
while 1とwhile Trueは同じ動作をしますが、Pythonでは意図が明確に伝わるwhile Trueが推奨されています。while 1はC言語など他の言語からの名残りで書かれることがありますが、可読性の観点からwhile Trueを使うのが現代のPythonらしい書き方です。
while 1とwhile Trueの評価の仕組み
# TrueとBool型・整数値の関係
print(bool(1)) # 1はTrueと評価される
print(bool(0)) # 0はFalseと評価される
print(True == 1) # TrueはInt値の1と等価
print(False == 0) # FalseはInt値の0と等価
# while文の条件評価
# while 1 → bool(1) = True → 永遠にループ
# while 0 → bool(0) = False → 一度も実行されない
# while True → True → 永遠にループ
# 出力結果:True
# 出力結果:False
# 出力結果:True
# 出力結果:True
Pythonでは整数の1はbool評価でTrueになるため、while 1はwhile Trueと同等に動作します。0はFalseになるためwhile 0はループが一度も実行されません。
フラグ変数を使った無限ループの制御
# フラグ変数でループを制御する
running = True
count = 0
while running:
count += 1
print(f"処理中:{count}回目")
if count >= 4:
running = False # フラグをFalseにしてループを終了
print(f"ループ終了(合計{count}回実行)")
# 出力結果:処理中:1回目
# 出力結果:処理中:2回目
# 出力結果:処理中:3回目
# 出力結果:処理中:4回目
# 出力結果:ループ終了(合計4回実行)
breakを使わずにフラグ変数でループを制御するパターンです。ループの終了条件が複数ある場合や、ループ外からの制御が必要な場面で使いやすい方法です。
breakとcontinueでループを制御する方法
続いては、breakとcontinueを使って無限ループを制御する方法を確認していきます。
無限ループを実用的に使うためには、breakで適切にループを抜ける制御と、continueで特定の処理をスキップする制御を理解することが大切です。
breakでループを抜ける基本パターン
# breakで条件に応じてループを終了する
items = ["アボカド", "ドラゴンフルーツ", "STOP", "サーモン", "ゴリラ茶"]
index = 0
while True:
if index >= len(items):
break
item = items[index]
if item == "STOP":
print(f"「STOP」を検出しました。処理を終了します。")
break
print(f"処理中:{item}")
index += 1
# 出力結果:処理中:アボカド
# 出力結果:処理中:ドラゴンフルーツ
# 出力結果:「STOP」を検出しました。処理を終了します。
breakは複数の場所に書くことができます。条件に応じてループを抜けるポイントを複数設けることで、柔軟なループ制御が実現できます。
continueで特定の処理をスキップする
# continueで特定の条件の処理をスキップする
count = 0
while True:
count += 1
if count > 10:
break
# 偶数はスキップ
if count % 2 == 0:
continue
print(f"奇数:{count}")
# 出力結果:奇数:1
# 出力結果:奇数:3
# 出力結果:奇数:5
# 出力結果:奇数:7
# 出力結果:奇数:9
continueはそれ以降の処理をスキップしてループの先頭に戻ります。フィルタリングや特定条件のスキップを実現する際にbreakとうまく組み合わせましょう。
while-elseでループ終了後の処理を書く
# while-elseのelse節はbreakなしで終了した場合に実行される
count = 0
while count < 5:
print(f"カウント:{count}")
count += 1
else:
# breakなしで条件がFalseになって終了した場合に実行
print("ループが正常に完了しました。")
print("---")
# breakで終了した場合はelse節は実行されない
count = 0
while count < 5:
if count == 3:
print("breakで終了")
break
count += 1
else:
print("このelse節は実行されません。")
# 出力結果:カウント:0
# 出力結果:カウント:1
# 出力結果:カウント:2
# 出力結果:カウント:3
# 出力結果:カウント:4
# 出力結果:ループが正常に完了しました。
# 出力結果:---
# 出力結果:breakで終了
while-elseのelse節はbreakなしでループが終了した場合のみ実行されます。検索処理で「見つかった場合はbreak、見つからなかった場合はelseで処理」というパターンに活用できます。
無限ループの実践的な応用パターン
続いては、無限ループを使った実践的なプログラムのパターンを確認していきます。
無限ループは対話型メニュー・リトライ処理・定期実行・サーバーの待ち受けなど、様々な実務シーンで活躍します。
対話型メニューを実装する
# 対話型メニューの実装(シミュレーション)
def show_menu():
menu_actions = ["1", "2", "3", "q"]
simulated_inputs = ["1", "2", "q"] # 入力をシミュレート
input_index = 0
while True:
print("--- メニュー ---")
print("1: アボカドを追加")
print("2: サーモンを追加")
print("q: 終了")
# 実際はinput()を使うが、ここではシミュレート
choice = simulated_inputs[input_index]
input_index += 1
print(f"入力:{choice}")
if choice == "1":
print("アボカドを追加しました。")
elif choice == "2":
print("サーモンを追加しました。")
elif choice == "q":
print("終了します。")
break
else:
print("無効な入力です。再度選択してください。")
# 出力結果:--- メニュー ---
# 出力結果:1: アボカドを追加
# 出力結果:2: サーモンを追加
# 出力結果:q: 終了
# 出力結果:入力:1
# 出力結果:アボカドを追加しました。
# 出力結果:--- メニュー ---
# 出力結果:入力:2
# 出力結果:サーモンを追加しました。
# 出力結果:--- メニュー ---
# 出力結果:入力:q
# 出力結果:終了します。
while Trueで繰り返しメニューを表示し、「q」が入力されたらbreakで終了するパターンはCLIツールの定番実装です。
リトライ処理に無限ループを使う
import random
# リトライ処理のシミュレーション
def fetch_data():
"""50%の確率で成功するAPI呼び出しをシミュレート"""
return random.random() > 0.5
max_retries = 5
retry_count = 0
while True:
retry_count += 1
print(f"試行{retry_count}回目...")
if fetch_data():
print(f"データ取得成功({retry_count}回目で成功)")
break
if retry_count >= max_retries:
print(f"最大リトライ数({max_retries}回)に達しました。")
break
print("リトライします...")
# 出力結果:試行1回目...
# 出力結果:リトライします...
# 出力結果:試行2回目...
# 出力結果:データ取得成功(2回目で成功)(毎回変わります)
最大リトライ数を設けて無限ループでリトライする処理は、ネットワーク通信やファイル操作など一時的な失敗が起きやすい処理でよく使われるパターンです。
定期実行処理に無限ループを使う
import time
# 定期実行処理のシミュレーション(3回で終了)
execution_count = 0
max_count = 3
while True:
execution_count += 1
print(f"定期処理実行({execution_count}回目):データを確認しています...")
# 実際の処理をここに書く
# 例:データベースの監視、ファイルの変更検知など
if execution_count >= max_count:
print("デモのため終了します。")
break
print("5秒後に再実行します...")
time.sleep(0.1) # デモ用に短縮(実際はtime.sleep(5)など)
# 出力結果:定期処理実行(1回目):データを確認しています...
# 出力結果:5秒後に再実行します...
# 出力結果:定期処理実行(2回目):データを確認しています...
# 出力結果:5秒後に再実行します...
# 出力結果:定期処理実行(3回目):データを確認しています...
# 出力結果:デモのため終了します。
while Trueとtime.sleep()を組み合わせた定期実行処理は、監視スクリプトやデータ収集ツールの基本パターンです。実際の運用ではKeyboardInterruptの例外処理も合わせて実装しましょう。
無限ループの注意点と安全な使い方
続いては、無限ループを使う際の注意点と安全な実装方法を確認していきます。
無限ループは便利なパターンですが、脱出条件の設計・例外処理・CPU負荷への配慮を怠ると問題が発生することがあります。
KeyboardInterruptを適切に処理する
import time
# Ctrl+Cによる中断を適切に処理する
print("処理を開始します。Ctrl+Cで終了できます。")
count = 0
try:
while True:
count += 1
print(f"実行中:{count}回目")
if count >= 3: # デモ用
break
time.sleep(0.1)
except KeyboardInterrupt:
print(f"\nCtrl+Cで中断されました。{count}回実行しました。")
finally:
print("後処理を実行しました。")
# 出力結果:処理を開始します。Ctrl+Cで終了できます。
# 出力結果:実行中:1回目
# 出力結果:実行中:2回目
# 出力結果:実行中:3回目
# 出力結果:後処理を実行しました。
try-except-finallyでKeyboardInterruptを捕捉することで、Ctrl+Cによる中断時にもファイルのクローズやログの保存といった後処理を確実に実行できます。
CPU負荷を下げるsleepの活用
import time
# sleepなし(CPU負荷が高い)
# while True:
# check_something() # CPUを100%使ってしまう
# sleepあり(CPU負荷を抑える)
count = 0
while True:
count += 1
# 処理
print(f"監視中:{count}回目")
if count >= 3:
break
# 一定時間待機してCPU負荷を下げる
time.sleep(0.1) # 実際は1秒・5秒・60秒など用途に応じて設定
print("完了")
# 出力結果:監視中:1回目
# 出力結果:監視中:2回目
# 出力結果:監視中:3回目
# 出力結果:完了
sleepなしの無限ループはCPUを100%使い続けてしまいます。監視処理や定期実行処理には必ずtime.sleep()を挟んで、CPU負荷を適切に抑えましょう。
まとめ
この記事では、Pythonのwhile 1とwhile Trueを使った無限ループの書き方について、基本的な仕組みからbreak・continue・実践的な応用パターン・注意点まで幅広く解説しました。
while 1とwhile Trueは同じ動作をしますが、Pythonではwhile Trueの使用が推奨されています。無限ループには必ずbreakやフラグ変数などの脱出手段を用意しておくことが大切です。対話型メニュー・リトライ処理・定期実行など、while Trueは様々な実務シーンで活躍します。
KeyboardInterruptのtry-except処理やtime.sleep()によるCPU負荷の軽減など、安全な無限ループの実装を心がけることで、信頼性の高いPythonプログラムが書けるようになります。ぜひ実際のプロジェクトで活用してみてください。