Pythonのwhile文によるループ処理(無限ループなど)
Pythonのwhile文によるループ(繰り返し)処理について説明する。条件がTrueである間ずっとブロック内の処理を繰り返す。無限ループの実装も可能。
for文については以下の記事を参照。リストなどの要素を取得して処理したり、決まった回数だけ処理したりする場合はfor文のほうが適切。
while文ではなく、for文と標準ライブラリitertoolsモジュールの関数を利用して無限ループを実装することもできる。カウンターを伴う無限ループなどはitertoolsを使うとスッキリ書ける。
Pythonのwhile文の基本的な使い方
Pythonにおけるwhile文は以下のように書く。
while 条件式:
処理
具体例は以下の通り。
i = 0
while i < 3:
print(i)
i += 1
# 0
# 1
# 2
条件式の部分はandやorで複数条件を指定したり、notで否定を指定したりできる。
whileループを途中で終了して抜ける: break
while文の途中でループを終了して抜けるにはbreakを使う。
i = 0
while i < 3:
print(i)
if i == 1:
print('!!BREAK!!')
break
i += 1
# 0
# 1
# !!BREAK!!
特定の条件でその後の処理をスキップ: continue
特定の条件でその後のブロック内の処理をスキップしたい場合はcontinueを使う。
breakはwhileループ全体が終了するが、continueはブロック内のcontinue文以降の処理がスキップされるのみ。whileループは継続する。
while i < 3:
if i == 1:
print('!!CONTINUE!!')
i += 1
continue
print(i)
i += 1
# 0
# !!CONTINUE!!
# 2
この例におけるi += 1のような条件式で用いる変数に対する処理をcontinueの後ろに書いてしまうと、その変数の値が更新されず、期せずして無限ループに陥ってしまうので注意。強制終了する方法は最後に述べる。
whileループ正常終了後の処理: else
while文によるループが条件式がFalseになるまで正常に実行された後に何らかの処理を行いたい場合はelseを使う。
i = 0
while i < 3:
print(i)
i += 1
else:
print('!!FINISH!!')
# 0
# 1
# 2
# !!FINISH!!
breakによって途中で終了した場合はelseの処理は実行されない。
i = 0
while i < 3:
print(i)
if i == 1:
print('!!BREAK!!')
break
i += 1
else:
print('!!FINISH!!')
# 0
# 1
# !!BREAK!!
continueの場合はwhileループ自体は継続するので、その後に途中終了されなければ最後にelseの処理が実行される。
i = 0
while i < 3:
if i == 1:
print('!!SKIP!!')
i += 1
continue
print(i)
i += 1
else:
print('!!FINISH!!')
# 0
# !!SKIP!!
# 2
# !!FINISH!!
"while True"による無限ループ
while 条件式:の条件式が常にTrueだと、ループから抜けることなく無限に処理が繰り返される。無限ループではbreak文がないと強制終了するしかなくなるため注意。
以下の例ではtime.time()でUNIX時間(エポック秒)を取得し経過時間を計測してbreakの終了条件としている。
import time
start = time.time()
while True:
time.sleep(1)
print('processing...')
if time.time() - start > 5:
print('!!BREAK!!')
break
# processing...
# processing...
# processing...
# processing...
# processing...
# !!BREAK!!
while True:でなくても条件式がTrueとみなされる式であれば無限ループになる。例えば0以外の数値や空ではない文字列やリストなどはTrueとみなされるので、while 1:なども無限ループとなる。
start = time.time()
while 1:
time.sleep(1)
print('processing...')
if time.time() - start > 5:
print('!!BREAK!!')
break
# processing...
# processing...
# processing...
# processing...
# processing...
# !!BREAK!!
また、冒頭にも書いたように、while文ではなく、for文と標準ライブラリitertoolsモジュールの関数を利用して無限ループを実装することもできる。カウンターを伴う無限ループなどはitertoolsを使うとスッキリ書ける。
キー入力で無限ループを抜ける
キーボードからの入力で無限ループを抜けるには、control + c(ctrl + c)によるKeyboardInterrupt例外をキャッチする方法がある。
try:
while True:
time.sleep(1)
print('processing...')
except KeyboardInterrupt:
print('!!FINISH!!')
実行中のターミナル(Mac)やコマンドプロンプト(Windowsのcmd.exe)などでcontrol + c(ctrl + c)を押すとwhileループが終了し、except節の処理が実行される。例外処理については以下の記事を参照。
強制終了
条件式の設定を誤ったりすると期せずして無限ループに陥ってしまうことがある。
そのような場合は以下のいずれかの方法で強制終了させる。
- 実行中のターミナルやコマンドプロンプト(
cmd.exe)などの端末でcontrol + c(ctrl + c) - アクティビティモニタやタスクマネージャーでプロセスを終了
Pythonというプロセス名を探して強制終了する