閉じる

【Python】while文の繰り返し入門|forとの違いと無限ループ対策まで解説

Pythonのwhile文は、条件が真である間ずっと同じ処理を繰り返せる便利な仕組みです。

for文と比べて「いつ終わるか決まっていない処理」に強く、ユーザー入力待ちやゲームループなどで活躍します。

本記事では、while文の基本構文からfor文との違い、無限ループを避けるポイント、そして安全にwhile Trueを書くコツまで、図解とサンプルコードを交えながら丁寧に解説します。

while文とは何か

Pythonのwhile文の基本構文と仕組み

Pythonのwhile文は、条件式がTrueである間、同じブロックの処理を繰り返し実行する構文です。

基本構文は次のようになります。

Python
# while文の基本構文

while 条件式:
    # 条件式がTrueの間、ここが繰り返し実行されるブロック
    処理1
    処理2
    ...
# 条件式がFalseになるとwhileループを抜けて、ここから続きが実行される
後続の処理

Pythonではwhile 条件式:の行の末尾に:を書き、その次の行からインデント(スペース4つが一般的)でブロックを表現します。

インデントがそろっている範囲が「繰り返される処理のかたまり」です

簡単なサンプル: 3回あいさつする

Python
count = 0  # カウンタ変数を0で初期化

while count < 3:  # 条件式: countが3より小さい間は繰り返す
    print("こんにちは")  # ループ内で実行される処理
    count = count + 1  # カウンタを1増やす(更新しないと無限ループになる)
    
print("ループ終了")
実行結果
こんにちは
こんにちは
こんにちは
ループ終了

この例ではcountが0,1,2のときにループが実行され、3になったところでcount < 3がFalseになり、ループを抜けます。

条件式とブロックの実行タイミング

while文では「ブロックを実行する前に、必ず条件式が評価される」という点がとても重要です。

流れを整理すると次のようになります。

  1. まず条件式を評価する
  2. 条件式がTrueなら、ブロック内の処理を上から順にすべて実行する
  3. ブロックの末尾まで実行したら、再び条件式の評価に戻る
  4. 条件式がFalseになったタイミングでループを抜け、後続の処理へ進む

この仕組みにより、例えばwhile x > 0:のように「ある変数が0を超えている間だけ繰り返す」といった柔軟な制御が可能になります。

条件式が最初からFalseの場合は、ブロックは一度も実行されないことにも注意が必要です。

Python
x = 0

while x > 0:  # 最初からFalseなので1回も実行されない
    print("これは表示されません")

print("完了")
実行結果
完了

while文が向いている処理パターン

while文は特に「ループの回数があらかじめ決まっていない処理」に向いています。

具体的には次のようなパターンです。

文章で説明すると、ユーザー入力や外部の状態に依存してループが終わるタイミングが決まるような処理です。

  • ユーザーが「exit」「終了」などの特定の文字列を入力するまで、入力受付と処理を繰り返す
  • ゲームで「ゲームオーバー」になるまで、毎フレーム更新処理をループする
  • ファイルやネットワークからデータを読み取り、データがなくなるまで処理を続ける
  • センサーやAPIから値を監視し、危険な値になったらループを止める

このようなケースでは終了条件そのものが「状態の変化」で決まるため、回数指定に強いfor文よりも、条件継続を得意とするwhile文のほうが自然に書けます。

while文とfor文の違い

Pythonのfor文との書き方と動作の比較

Pythonではfor文も繰り返し処理を行う構文です。

ただし考え方が少し異なります。

  • for文: 「リストやrangeなど決まった集まりから要素を1つずつ取り出しながら繰り返す」
  • while文: 「条件がTrueの間、ずっと処理を繰り返す」

表にすると違いが見やすくなります。

比較項目for文while文
繰り返しの基準コレクション(リスト、range、文字列など)条件式(True / False)
回数のイメージ最初から回数が決まっていることが多い回数が決まっていないことが多い
よくある用途リストの全要素処理、決まった回数のループユーザー入力待ち、状態監視、ゲームループなど
書きやすさ範囲や配列がある場合は簡潔に書ける条件が複雑でも柔軟に対応できる
無限ループの危険比較的少ないカウンタ更新忘れなどで起きやすい

同じ処理をforとwhileで書き比べる

0〜4までの数を表示する処理を、for文とwhile文でそれぞれ書いてみます。

Python
# for文の例: 0〜4を表示
for i in range(5):
    print(i)
Python
# while文の例: 0〜4を表示
i = 0  # カウンタの初期値

while i < 5:  # 条件式
    print(i)
    i = i + 1  # カウンタの更新を自分で書く必要がある
実行結果
0
1
2
3
4

表示結果は同じですが、for文はrange(5)という「0〜4の集まり」を1つずつ取り出しているのに対し、while文は条件式とカウンタ更新を自分で管理している点が違います。

回数指定の繰り返しはfor文、条件継続はwhile文

一般的な指針として次のように使い分けるとコードが読みやすくなります。

  • 「何回繰り返すか」が明確な場合 → for文を優先
  • 「どんな状態になったら終わるか」で考えたい場合 → while文を優先

例えば以下のように整理できます。

  • 「10回だけ試行する」→ for文でfor i in range(10):
  • 「成功するまで試行する」→ while文でwhile not success:
  • 「リストの全要素を処理する」→ for文でfor item in items:
  • 「ユーザーが’quit’と入力するまで受け付ける」→ while文でwhile command != "quit":

この方針を守ると、コードを見ただけで「これは回数ベースのループなのか、条件ベースのループなのか」が一目で分かるようになります。

リスト・rangeを使う場合とwhile文を使う場合の使い分け

リストやrangeを扱うとき、多くの場合はfor文のほうが簡潔です。

ただし、状況によってはwhile文が適していることもあります。

基本: リストやrangeをそのまま回すならfor文

Python
# リストの全要素を表示(推奨: for)
numbers = [10, 20, 30, 40]

for n in numbers:
    print(n)
実行結果
10
20
30
40

同じことをwhile文で書くと、インデックス管理が必要になり少し冗長になります。

Python
numbers = [10, 20, 30, 40]
i = 0

while i < len(numbers):  # 長さとインデックスで条件を作る
    print(numbers[i])
    i = i + 1

要素を途中で削除・追加しながら処理したい場合

リストの中身を途中で増減しながらループしたい場合、単純なfor文では意図しない動作になることがあります

そのようなときはwhile文が役立ちます。

Python
# 0が出てくるまでリストの先頭から要素を取り出し続ける例
numbers = [3, 5, 0, 7]

while len(numbers) > 0:  # リストが空でない間
    x = numbers.pop(0)   # 先頭の要素を取り出す
    print("取り出した:", x)
    if x == 0:
        print("0が出たので終了")
        break
実行結果
取り出した: 3
取り出した: 5
取り出した: 0
0が出たので終了

このようにリストの状態そのものがループ条件に関係している場合は、while文のほうが自然なことがあります。

while文の基本的な書き方と例

カウンタ変数を使ったwhileループの書き方

while文で回数を管理したいときは、カウンタ変数を使ったパターンを覚えておくと便利です。

基本形は次の3ステップです。

  1. カウンタ変数を初期化する
  2. 条件式でループ継続の判定を行う
  3. ループの最後でカウンタを更新する
Python
# 1から5までの数字を表示するwhile文

i = 1              # 1. カウンタの初期化

while i <= 5:      # 2. 条件式(iが5以下なら続行)
    print(i)       #    ループ内の処理
    i = i + 1      # 3. カウンタの更新(インクリメント)

print("完了")
実行結果
1
2
3
4
5
完了

この3つの要素がそろっていないと無限ループになる可能性があるため、特にカウンタの更新を書き忘れていないかを意識してください。

入力が続く限り処理するwhileループの例

ユーザーが「終了」と入力するまで、繰り返し入力を受け付ける例を見てみます。

これは典型的な「いつ終わるか分からない」処理なので、while文がぴったりです。

Python
# ユーザーが"exit"と入力するまで合計を計算する例

total = 0  # 合計値の初期化

while True:  # 無限ループにしておき、中でbreakするパターン
    text = input("数字を入力してください(exitで終了): ")
    
    if text == "exit":  # 終了条件
        print("入力を終了します。")
        break  # ループを抜ける
    
    # 数字に変換を試みる
    try:
        num = int(text)
    except ValueError:
        print("数字ではありません。もう一度入力してください。")
        continue  # ループの先頭に戻る
    
    total = total + num
    print("現在の合計:", total)

print("最終的な合計は", total, "です。")
実行結果
数字を入力してください(exitで終了): 10
現在の合計: 10
数字を入力してください(exitで終了): 20
現在の合計: 30
数字を入力してください(exitで終了): abc
数字ではありません。もう一度入力してください。
数字を入力してください(exitで終了): 5
現在の合計: 35
数字を入力してください(exitで終了): exit
入力を終了します。
最終的な合計は 35 です。

ここではwhile True:で一旦「無限ループ」を宣言し、中でif text == "exit": breakとすることで分かりやすい終了条件を作っています。

この書き方は後ほど「while Trueを安全に使うためのコツ」でさらに詳しく解説します。

breakとcontinueを使ったwhile文の制御方法

while文ではbreakcontinueという2つのキーワードを使って、ループの流れを細かく制御できます。

  • break: ループそのものを途中で完全に抜ける
  • continue: 現在の周回(1回分)を中断し、すぐに次の条件判定へ進む

breakの例: 条件を満たしたらループを終了

Python
# 1から順に数え、最初に3で割り切れる数が出たら終了する例

n = 1

while n <= 10:
    print("n =", n)
    
    if n % 3 == 0:  # 3で割り切れるかチェック
        print("最初に3の倍数が見つかりました:", n)
        break       # ループを終了
    
    n = n + 1

print("ループを抜けました。")
実行結果
n = 1
n = 2
n = 3
最初に3の倍数が見つかりました: 3
ループを抜けました。

continueの例: 特定の条件のときだけ処理をスキップ

Python
# 1〜10のうち、偶数だけを表示する例(奇数のときはスキップ)

n = 1

while n <= 10:
    if n % 2 == 1:  # 奇数なら
        n = n + 1   # カウンタを増やして
        continue    # 以降の処理をスキップし、次へ
    
    print("偶数:", n)
    n = n + 1
実行結果
偶数: 2
偶数: 4
偶数: 6
偶数: 8
偶数: 10

ここで重要なのは、continueを使った場合でも、カウンタの更新を忘れないことです。

更新を書かないと、条件がいつまでも変わらず無限ループになってしまいます。

while文の無限ループ対策

Pythonで無限ループが起きる典型的な原因

while文で怖いのは無限ループです。

Pythonで無限ループが起きる典型的な原因は次のようなものです。

  • カウンタ変数を更新していない、または間違った方向に更新している
  • 条件式がそもそもFalseになり得ない(例: while 1 < 2:)
  • breakで抜けるつもりが、条件の矛盾や入力の想定漏れでbreakが一度も実行されない
  • 外部状態が変わらない前提なのに、実際には変化しない(例: 常に同じ値を返す関数に依存)

カウンタ更新忘れの例

Python
# 無限ループになってしまう危険なコード(実行しないことを推奨)

i = 0

while i < 5:
    print(i)
    # i = i + 1 を書き忘れている!

このコードは<i = 0</i>のまま変化しないため、i < 5が永遠にTrueで、ループが止まりません。

条件式とカウンタ更新のチェックポイント

無限ループを防ぐために、while文を書くときは次のポイントをチェックすると安全です。

  1. このループは「いつ」「どの条件で」終わるのかを日本語で説明できるか
  2. その説明とwhile 条件式が一致しているか
  3. ループの中で、必ず条件式に関係する値が変化する処理が存在するか

具体例で確認

「iが5以上になったら終わるループ」を書きたいとき、説明はこうなります。

  • 日本語のルール: 「iが5以上になったら終わる」
  • 条件式: 「iが5未満の間続ける」→ while i < 5:
  • iはループのたびに1ずつ増やす → i = i + 1
Python
i = 0

while i < 5:       # 「iが5未満の間続ける」
    print(i)
    i = i + 1      # iを必ず増やす

このように日本語の仕様 → 条件式 → 更新処理が一貫しているかどうかを確認すると、無限ループをかなり防げます。

無限ループから抜けるためのbreakの活用

無限ループは基本的には避けるべきですが、意図的に無限ループを書き、breakで安全に抜けるというテクニックもよく使われます。

Python
# 最大10回までに制限しつつ、条件を満たしたら途中で抜ける例

count = 0

while True:  # いったん無限ループ
    count = count + 1
    print("処理回数:", count)
    
    # 何らかの条件で成功したと仮定
    if count == 3:
        print("成功したのでループを抜けます。")
        break  # ここでループ終了
    
    # 安全装置: 10回を超えたら強制終了
    if count >= 10:
        print("回数上限に達したので強制終了します。")
        break
実行結果
処理回数: 1
処理回数: 2
処理回数: 3
成功したのでループを抜けます。

このように「本来の終了条件」と「安全装置としての終了条件」の2つを用意してbreakで抜けると、予期せぬ不具合で本来の条件に到達しない場合でも無限ループを防ぎやすくなります。

while Trueを安全に使うためのコツ

while True:は一見すると無限ループで危険に見えますが、適切にbreakと組み合わせれば、非常に読みやすく書ける構文です。

安全に使うためのコツをまとめます。

  1. ループの中に「必ず到達しうるbreak」を1つ以上用意する
  2. 「終了条件」をまとまりとして先に書き、そのあとに通常処理を書く
  3. 何か異常があってもループが暴走しないよう、タイムアウトや最大回数などの「保険的なbreak」を入れる

安全なwhile Trueの典型パターン

Python
# ユーザー入力を繰り返し受け付ける、安全なwhile Trueの書き方

MAX_TRY = 5  # 保険として最大試行回数を決める
count = 0

while True:
    count = count + 1
    
    # 1. 先に「終了条件」をチェック
    if count > MAX_TRY:
        print("試行回数が上限に達したため、終了します。")
        break
    
    command = input("コマンドを入力してください(exitで終了): ")
    
    # 2. メインの終了条件
    if command == "exit":
        print("exitが入力されたため、終了します。")
        break
    
    # 3. 通常の処理を最後にまとめる
    print("コマンド:", command, "を処理します。")
実行結果
コマンドを入力してください(exitで終了): test
コマンド: test を処理します。
コマンドを入力してください(exitで終了): hello
コマンド: hello を処理します。
コマンドを入力してください(exitで終了): exit
exitが入力されたため、終了します。

このように「終了条件を先」「通常処理を後」という順序で書くと、コードを読む人が「どんな場合にループが終わるのか」をすぐに理解でき、バグも入りにくくなります。

まとめ

while文は「条件がTrueの間、処理を繰り返す」構文で、特に「いつ終わるか決まっていない処理」に適しています。

回数がはっきりしている場合はfor文、終了条件で決まる処理はwhile文、と使い分けるとコードが読みやすくなります。

無限ループを防ぐためには、条件式とカウンタ更新の整合性を常に意識し、必要に応じてbreakやwhile True+安全装置を活用してください。

こうしたポイントを押さえれば、while文はPythonで非常に強力な武器になります。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!