Pythonのwhile文によるループ処理(無限ループなど)

Pythonのwhile文によるループ(繰り返し)処理について説明します。リストなどのイテラブルの要素を順次取り出して処理するfor文とは異なり、条件が真Trueである間はずっとブロック内の処理を繰り返します。

  1. 複合文 (compound statement) while文 — Python 3.7.2 ドキュメント

ここでは以下の内容について説明します。

Pythonのwhile文の基本的な使い方 条件によって途中で終了: break 特定の条件でその後の処理をスキップ: continue ループ正常終了後の処理: else while文による無限ループ キーボード入力で終了 強制終了

for文についてはリストなどの要素を取得して処理したり、決まった回数だけ処理したりする場合はfor文のほうが適切。

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!!')

実行中のターミナルやコマンドプロンプト(cmd.exe)などの端末でctrl + cを押すとwhileループが終了し、except節の処理が実行されます。例外処理については

強制終了

条件式の設定を誤ったりすると期せずして無限ループに陥ってしまうことがあります。 そのような場合は以下のいずれかの方法で強制終了させる。

実行中のターミナルやコマンドプロンプト(cmd.exe)などの端末でctrl + c アクティビティモニタやタスクマネージャーでプロセスを終了 Pythonというプロセス名を探して強制終了する

Last Updated: 6/26/2019, 10:34:03 PM