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
というプロセス名を探して強制終了する