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は数値変換より先に判定します。




