Python講座 / while・break・continueで繰り返しを制御する

while文は条件が真の間、処理を繰り返します。breakは一番内側のループを終了し、continueはその回の残りを飛ばすため、どの経路でも終了に必要な状態が更新されるかを確認します。

条件に応じた繰り返しを選ぶ

処理する要素があらかじめあるならfor、変化する状態や繰り返しの入力で終了が決まるならwhileが候補になります。while Trueも、内部の終了規則が明確なら適切な書き方です。

状態を変える行がcontinueの後にしかないと、入力によってはその更新を飛ばし、無限ループになることがあります。応答しない場合はCtrl+Cで止め、条件を変える行に実際に到達しているかを調べます。単に反復回数を増やして解決しようとしないでください。

qで終わる入力プログラムを実行する

while_input.pyへ全体コードをUTF-8で保存し、仮想環境でpython while_input.pyを実行します。3500、空行、-1、qの順に入力します。

total = 0
while True:
    text = input("amount or q: ").strip()
    if text == "q":
        break
    if text == "":
        continue
    amount = int(text)
    if amount < 0:
        print("skip negative")
        continue
    total += amount
print("total:", total)

入力文字を除く標準出力だけを示すと次のようになります。実際のターミナルでは入力文字が表示され、行の見え方が違う場合があります。

amount or q: amount or q: amount or q: skip negative
amount or q: total: 3500

入力ごとの経路を追う

qはbreakで終了します。空文字はcontinueへ進みますが、次の回で再びinput()を呼ぶため入力状態は更新されます。負数はskip negativeを表示し、合計へ加えません。これは整数またはqという前提の例なので、abcはまだValueErrorになります。

例外処理を追加する場合も、終了コマンドの判定を数値変換の前へ置きます。そうすればqを不正な整数として扱わずに済みます。入力待ちと無限ループの違いも、どの行で待っているかを見て判断します。

終了の範囲と境界を確認する

breakが抜けるのは一番内側のループだけです。多重ループをまとめて抜けるなら、明示的な状態管理や関数からのreturnなどが必要です。continueも自分が属するループだけに作用します。

最初にqを入力すると合計は0です。0は空文字ではなく、有効な金額として通ります。大文字Qはこの例ではqと違う扱いになるので、正規化するかは仕様として決めてください。例外処理では、想定した変換失敗だけを扱い、終了手段を保ったまま入力し直す方法を学べます。

10 → 20 → q と入力して合計30を確認し、再実行して abc を入力します。整数を前提とする元の例では変換エラーになります。再入力を許す場合はint変換をtryで囲み、ValueErrorのときに案内してcontinueします。終了入力qは数値変換より先に判定します。

関連する公式リファレンス