Pythonのwhile文は、条件が真である間ずっと同じ処理を繰り返せる便利な仕組みです。
for文と比べて「いつ終わるか決まっていない処理」に強く、ユーザー入力待ちやゲームループなどで活躍します。
本記事では、while文の基本構文からfor文との違い、無限ループを避けるポイント、そして安全にwhile Trueを書くコツまで、図解とサンプルコードを交えながら丁寧に解説します。
while文とは何か
Pythonのwhile文の基本構文と仕組み

Pythonのwhile文は、条件式がTrueである間、同じブロックの処理を繰り返し実行する構文です。
基本構文は次のようになります。
# while文の基本構文
while 条件式:
# 条件式がTrueの間、ここが繰り返し実行されるブロック
処理1
処理2
...
# 条件式がFalseになるとwhileループを抜けて、ここから続きが実行される
後続の処理
Pythonではwhile 条件式:の行の末尾に:を書き、その次の行からインデント(スペース4つが一般的)でブロックを表現します。
インデントがそろっている範囲が「繰り返される処理のかたまり」です。
簡単なサンプル: 3回あいさつする
count = 0 # カウンタ変数を0で初期化
while count < 3: # 条件式: countが3より小さい間は繰り返す
print("こんにちは") # ループ内で実行される処理
count = count + 1 # カウンタを1増やす(更新しないと無限ループになる)
print("ループ終了")
こんにちは
こんにちは
こんにちは
ループ終了
この例ではcountが0,1,2のときにループが実行され、3になったところでcount < 3がFalseになり、ループを抜けます。
条件式とブロックの実行タイミング

while文では「ブロックを実行する前に、必ず条件式が評価される」という点がとても重要です。
流れを整理すると次のようになります。
- まず条件式を評価する
- 条件式がTrueなら、ブロック内の処理を上から順にすべて実行する
- ブロックの末尾まで実行したら、再び条件式の評価に戻る
- 条件式がFalseになったタイミングでループを抜け、後続の処理へ進む
この仕組みにより、例えばwhile x > 0:のように「ある変数が0を超えている間だけ繰り返す」といった柔軟な制御が可能になります。
条件式が最初からFalseの場合は、ブロックは一度も実行されないことにも注意が必要です。
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文でそれぞれ書いてみます。
# for文の例: 0〜4を表示
for i in range(5):
print(i)
# 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文
# リストの全要素を表示(推奨: for)
numbers = [10, 20, 30, 40]
for n in numbers:
print(n)
10
20
30
40
同じことをwhile文で書くと、インデックス管理が必要になり少し冗長になります。
numbers = [10, 20, 30, 40]
i = 0
while i < len(numbers): # 長さとインデックスで条件を作る
print(numbers[i])
i = i + 1
要素を途中で削除・追加しながら処理したい場合
リストの中身を途中で増減しながらループしたい場合、単純なfor文では意図しない動作になることがあります。
そのようなときはwhile文が役立ちます。
# 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から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文がぴったりです。
# ユーザーが"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文ではbreakとcontinueという2つのキーワードを使って、ループの流れを細かく制御できます。
break: ループそのものを途中で完全に抜けるcontinue: 現在の周回(1回分)を中断し、すぐに次の条件判定へ進む
breakの例: 条件を満たしたらループを終了
# 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の例: 特定の条件のときだけ処理をスキップ
# 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が一度も実行されない
- 外部状態が変わらない前提なのに、実際には変化しない(例: 常に同じ値を返す関数に依存)
カウンタ更新忘れの例
# 無限ループになってしまう危険なコード(実行しないことを推奨)
i = 0
while i < 5:
print(i)
# i = i + 1 を書き忘れている!
このコードは<i = 0</i>のまま変化しないため、i < 5が永遠にTrueで、ループが止まりません。
条件式とカウンタ更新のチェックポイント

無限ループを防ぐために、while文を書くときは次のポイントをチェックすると安全です。
- このループは「いつ」「どの条件で」終わるのかを日本語で説明できるか
- その説明と
while 条件式が一致しているか - ループの中で、必ず条件式に関係する値が変化する処理が存在するか
具体例で確認
「iが5以上になったら終わるループ」を書きたいとき、説明はこうなります。
- 日本語のルール: 「iが5以上になったら終わる」
- 条件式: 「iが5未満の間続ける」→
while i < 5: - iはループのたびに1ずつ増やす →
i = i + 1
i = 0
while i < 5: # 「iが5未満の間続ける」
print(i)
i = i + 1 # iを必ず増やす
このように日本語の仕様 → 条件式 → 更新処理が一貫しているかどうかを確認すると、無限ループをかなり防げます。
無限ループから抜けるためのbreakの活用

無限ループは基本的には避けるべきですが、意図的に無限ループを書き、breakで安全に抜けるというテクニックもよく使われます。
# 最大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と組み合わせれば、非常に読みやすく書ける構文です。
安全に使うためのコツをまとめます。
- ループの中に「必ず到達しうるbreak」を1つ以上用意する
- 「終了条件」をまとまりとして先に書き、そのあとに通常処理を書く
- 何か異常があってもループが暴走しないよう、タイムアウトや最大回数などの「保険的なbreak」を入れる
安全なwhile Trueの典型パターン
# ユーザー入力を繰り返し受け付ける、安全な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で非常に強力な武器になります。
