言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Python辞典

  1. トップページ
  2. Python辞典
  3. while / do-while ループ

while / do-while ループ

『Python』のwhile文は条件式が真である間、ブロックを繰り返す構文です。条件はブロックの実行前に評価されるため、最初から条件が偽であれば一度も実行されません。無限ループ(while True:)とbreakを組み合わせたパターンや、for文と同様に使えるelse節も特徴的な機能です。

構文

# 基本構文
while 条件式:
    # 条件が真の間、繰り返す処理

# 無限ループ + break パターン
while True:
    # 繰り返す処理
    if 終了条件:
        break

# else 節:break で終了しなかった場合に実行されます。
while 条件式:
    処理
else:
    # ループが正常に終了したときだけ実行されます。

# do-while 相当(最低1回は実行するパターン)
while True:
    # 最低1回は必ず実行される処理
    if 終了条件:
        break

キーワード一覧

構文 / キーワード概要
while 条件式:条件式が真(Truthy)の間、ブロックを繰り返します。条件はブロック実行前に評価されます。
while True:条件を常に真にして無限ループを作ります。break で脱出するのが基本パターンです。
breakループを即座に終了します。while の else 節はスキップされます。
continue残りの処理をスキップして、次の条件評価に移ります。
while ... else:ループが break されずに正常終了したときに else ブロックを実行します。

サンプルコード

カウンターを使った基本のwhileループです。呪術廻戦の術式名を一定回数出力するサンプルです。

basic_while.py
# カウンターを使って指定回数だけ繰り返します。
count = 0

while count < 3:
    print(f"黒閃 発動中({count + 1}回目)")
    count += 1  # カウンターを更新しないと無限ループになります。

print("終了")
python3 basic_while.py
黒閃 発動中(1回目)
黒閃 発動中(2回目)
黒閃 発動中(3回目)
終了

無限ループ(while True:)とbreakを組み合わせたパターンです。一定の条件を満たすまで処理を繰り返す場合に使います。

infinite_loop.py
import random

# 呪力が0になるまで術式を発動し続けるシミュレーションです。
cursed_energy = 100

while True:
    # 毎ターンランダムな消費量を計算します。
    cost = random.randint(10, 40)
    cursed_energy -= cost
    print(f"術式発動: 呪力 -{cost} → 残り {cursed_energy}")

    # 呪力が0以下になったらループを終了します。
    if cursed_energy <= 0:
        print("呪力切れ。術式を停止します。")
        break
python3 infinite_loop.py
術式発動: 呪力 -23 → 残り 77
術式発動: 呪力 -35 → 残り 42
術式発動: 呪力 -18 → 残り 24
術式発動: 呪力 -30 → 残り -6
呪力切れ。術式を停止します。

else節はbreakで終了しなかった場合にだけ実行されます。目標の呪霊を見つけられたかどうかを判定するサンプルです。

while_else.py
# 呪霊のリストから特定の等級を持つ呪霊を探します。
curses = [
    ("花御", 1),
    ("真人", 1),
    ("漏瑚", 1),
    ("陀艮", 1),
]
target_grade = 2   # この等級の呪霊を探します。
index = 0

while index < len(curses):
    name, grade = curses[index]
    if grade == target_grade:
        print(f"{name}(特級{grade})を発見しました")
        break
    index += 1
else:
    # break されずにループが終わった場合(見つからなかった場合)に実行されます。
    print(f"等級 {target_grade} の呪霊は見つかりませんでした")
python3 while_else.py
等級 2 の呪霊は見つかりませんでした

Pythonにはdo-while文がありませんが、while True:とbreakで同等の処理を書けます。ブロックが最低1回は必ず実行されます。

do_while_pattern.py
# do-while 相当のパターン:ブロックを先に実行してから条件を評価します。
# 虎杖悠仁の連続パンチを最低1回は発動するシミュレーションです。
punch_count = 0
max_punches = 3

while True:
    punch_count += 1
    print(f"逕庭拳 {punch_count}発目")

    # 条件をブロックの末尾で評価します(do-whileの代替)。
    if punch_count >= max_punches:
        break

print(f"合計 {punch_count} 発")
python3 do_while_pattern.py
逕庭拳 1発目
逕庭拳 2発目
逕庭拳 3発目
合計 3 発

continueで特定の条件の繰り返しをスキップします。禁忌に触れたターンだけ処理をスキップするサンプルです。

while_continue.py
# ターン数を進めながら、禁忌ターンだけスキップします。
turn = 0
forbidden_turns = {2, 4}   # この番号のターンは禁忌です。

while turn < 6:
    turn += 1

    # 禁忌ターンは処理をスキップして次のターンへ進みます。
    if turn in forbidden_turns:
        print(f"ターン {turn}: 禁忌(スキップ)")
        continue

    print(f"ターン {turn}: 通常行動")
python3 while_continue.py
ターン 1: 通常行動
ターン 2: 禁忌(スキップ)
ターン 3: 通常行動
ターン 4: 禁忌(スキップ)
ターン 5: 通常行動
ターン 6: 通常行動

概要

while文は「繰り返す回数が事前にわからない」ケースに向いています。回数が決まっているループにはfor文とrange()の組み合わせの方が適しています。詳しくはfor文を参照してください。

無限ループ(while True:)はユーザー入力の受付やサーバーのリクエスト待機など実用的な場面で頻繁に使われるパターンです。ただし、必ずbreak条件を用意することが重要です。更新処理(カウンターのインクリメントなど)を忘れると意図せず無限ループになる場合があります。

else節の動作はfor文と同じで、break によってループが終了した場合は実行されません。「目標が見つかった/見つからなかった」を後続のフラグ変数なしに判断できるため、検索ループを書く際に役立ちます。Pythonにはdo-while文が存在しませんが、while True: ... if 条件: break のパターンで同等の動作を表現できます。

よくあるミス

カウンターの更新を忘れて無限ループ

while ループ内でカウンター変数の更新を忘れると、条件が変わらずに無限ループになります。

while_infinite_ng.py
# NGパターン: i が更新されないため無限ループ
i = 0
while i < 3:
    print("Itadori Yuji")
    # i += 1 が抜けている
while_infinite_ok.py
# OKパターン: カウンターを必ず更新する
i = 0
while i < 3:
    print("Itadori Yuji")
    i += 1
Itadori Yuji
Itadori Yuji
Itadori Yuji

off-by-one エラー(境界値のミス)

条件に <<= のどちらを使うかで、ループ回数が1回変わります。

while_offbyone.py
members = ["Itadori Yuji", "Megumi Fushiguro", "Nobara Kugisaki", "Gojo Satoru", "Nanami Kento"]

# NGパターン: <= にすると IndexError
i = 0
while i <= len(members):  # 5 までループするので members[5] でエラー
    print(members[i])
    i += 1
while_offbyone_ok.py
members = ["Itadori Yuji", "Megumi Fushiguro", "Nobara Kugisaki", "Gojo Satoru", "Nanami Kento"]

# OKパターン: < を使う
i = 0
while i < len(members):
    print(members[i])
    i += 1
Itadori Yuji
Megumi Fushiguro
Nobara Kugisaki
Gojo Satoru
Nanami Kento

break を書き忘れて無限ループのまま

while True: で書くパターンでは、ループを抜ける条件に対して break を書かないと永遠にループし続けます。

while_break.py
# OKパターン: 脱出条件を明示する
attempts = 0
while True:
    attempts += 1
    if attempts >= 3:
        print(f"Reached {attempts} attempts. Stopping.")
        break
    print(f"Attempt {attempts}")
Attempt 1
Attempt 2
Reached 3 attempts. Stopping.

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。