note.nkmk.me

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

Date: 2019-02-02 / tags: Python

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

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

  • 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

条件式の部分はandorで複数条件を指定したり、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というプロセス名を探して強制終了する
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事