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

Modified: | Tags: Python

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

条件式の部分はandorで複数条件を指定したり、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 + cctrl + c)によるKeyboardInterrupt例外をキャッチする方法がある。

try:
    while True:
        time.sleep(1)
        print('processing...')
except KeyboardInterrupt:
    print('!!FINISH!!')

実行中のターミナル(Mac)やコマンドプロンプト(Windowsのcmd.exe)などでcontrol + cctrl + c)を押すとwhileループが終了し、except節の処理が実行される。例外処理については以下の記事を参照。

強制終了

条件式の設定を誤ったりすると期せずして無限ループに陥ってしまうことがある。

そのような場合は以下のいずれかの方法で強制終了させる。

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

関連カテゴリー

関連記事