Pythonのwhile文によるループ処理(無限ループなど)
Pythonのwhile文によるループ(繰り返し)処理について説明する。リストなどのイテラブルの要素を順次取り出して処理するfor文とは異なり、条件が真True
である間はずっとブロック内の処理を繰り返す。
ここでは以下の内容について説明する。
- Pythonのwhile文の基本的な使い方
- 条件によって途中で終了:
break
- 特定の条件でその後の処理をスキップ:
continue
- ループ正常終了後の処理:
else
- while文による無限ループ
- キーボード入力で終了
- 強制終了
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
で否定を指定したりできる。
条件によって途中で終了: 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
の後ろに書いてしまうと、その変数の値が更新されず、期せずして無限ループに陥ってしまうので注意。強制終了する方法は最後に述べる。
ループ正常終了後の処理: 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文による無限ループ
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!!
なお、上では説明のために無限ループにしているが、同様の処理は以下のように無限ループを使わずに書ける。この例ではこちらのほうがスッキリする。
start = time.time()
while time.time() - start <= 5:
time.sleep(1)
print('processing...')
else:
print('!!FINISH!!')
# processing...
# processing...
# processing...
# processing...
# processing...
# !!FINISH!!
キーボード入力で終了
break
を設定するのではなくキーボードの入力で無限ループを抜けるには、ctrl + c
によるKeyboardInterrupt
例外をキャッチする方法がある。
try:
while True:
time.sleep(1)
print('processing...')
except KeyboardInterrupt:
print('!!FINISH!!')
実行中のターミナル(Mac)やコマンドプロンプト(Windowsのcmd.exe
)などでctrl + c
を押すとwhileループが終了し、except
節の処理が実行される。例外処理については以下の記事を参照。
強制終了
条件式
の設定を誤ったりすると期せずして無限ループに陥ってしまうことがある。
そのような場合は以下のいずれかの方法で強制終了させる。
- 実行中のターミナルやコマンドプロンプト(
cmd.exe
)などの端末でctrl + c
- アクティビティモニタやタスクマネージャーでプロセスを終了
Python
というプロセス名を探して強制終了する