基礎から学ぶPython入門 90日コース | Python基礎 - Day 7:while文

Python 90日で身につけるPython
スポンサーリンク
スポンサーリンク

Day 7:while文 ― 「条件が続く限り、ずっと処理を繰り返す」

Day 7では、「while文」を扱います。 while文は、「ある条件がTrueである間、同じ処理を繰り返す」ための仕組みです。 Day 6のfor文は「決まった回数・決まった集まり」を回すのに向いていましたが、while文は「いつ終わるかが条件次第で変わる処理」に向いています。 ここでは、while の基本から、無限ループ、breakcontinue までをステップバイステップで見ていきます。

while ― 「条件がTrueの間、ずっと同じブロックを実行する」

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

# while文の基本形

count = 0  # カウンタ変数

# countが5未満の間、ループを続ける
while count < 5:
    print(f"countの値: {count}")
    count += 1  # countを1増やす(これをしないと永遠に0のままになります)
Python

このコードの流れはこうです。

  1. count = 0 からスタートします。
  2. while count < 5: の条件をチェックします。
    • 最初は 0 < 5 なのでTrue → ブロックを実行します。
  3. ブロックの中で print() を実行し、count += 1count を1増やします。
  4. 再び while の条件に戻り、count < 5 をチェックします。
    • count が 1, 2, 3, 4 の間はTrueなので、繰り返し続けます。
  5. count が 5 になったとき、5 < 5 はFalseになるので、ループを抜けます。

ここで重要なのは、「条件がいつかFalseになるように、中で変数を更新すること」です。 もし count += 1 を書き忘れると、count はずっと0のままで、条件 count < 5 が永遠にTrueになり、ループが終わらなくなります。

無限ループ ― 「条件がずっとTrueのままのループ」

無限ループとは、「終わりの条件がなく、ずっと続くループ」のことです。 Pythonでは、次のように書けます。

# 無限ループの基本形

while True:
    print("これは永遠に表示されます(止めるにはCtrl+Cなどが必要です)")
Python

while True: は、「条件が常にTrue」であるため、プログラムを強制終了しない限りループが終わりません。

無限ループは、一見すると危険なものに見えますが、「常に動き続ける監視処理」や「サーバーのメインループ」など、実用的な場面でも使われます。 ただし、必ず「どこかで抜ける仕組み(break や外部からの停止)」を用意しておくことが重要です。

例えば、「ユーザーからの入力を繰り返し受け付ける」簡易例を見てみます。

# ユーザー入力を繰り返し受け付ける無限ループの例

while True:
    command = input("コマンドを入力してください(exitで終了): ")

    if command == "exit":
        print("終了します")
        break  # ループを抜けてプログラムを終わらせる

    print(f"入力されたコマンド: {command}")
Python

ここでは、while True: で無限ループを作りつつ、 ユーザーが exit と入力したときに break でループを抜けるようにしています。

セキュリティの観点では、「無限ループが意図せず発生すると、CPUを占有してサービス障害につながる」ことがあります。 そのため、「条件が必ずどこかでFalseになるか」「break で抜ける経路があるか」を常に意識することが大事です。

break ― 「ループを“今すぐ完全に抜ける”ためのスイッチ」

break は、「ループを途中で完全に抜ける」ためのキーワードです。 for文でもwhile文でも使えますが、ここではwhile文との組み合わせに注目します。

基本的な例を見てみます。

# breakの基本

count = 0

while count < 10:
    print(f"count: {count}")
    if count == 3:
        print("countが3になったのでループを抜けます")
        break  # ここでループを終了する
    count += 1
Python

このコードの流れはこうです。

  • count が 0, 1, 2 のときは、if count == 3 がFalseなので、break は実行されません。
  • count が 3 になったとき、if count == 3 がTrueになり、break が実行されます。
  • break が実行されると、while のループを即座に抜けて、次の処理に進みます。

break は、「特定の条件を満たしたら、もうこれ以上ループを続ける必要がない」というときに使います。

セキュリティ寄りの例として、「危険な入力が見つかったらすぐに処理を止める」イメージを見てみます。

# 危険な文字が見つかったらループを止める例(簡易版)

user_input = "hello<script>alert('XSS');</script>world"
dangerous_chars = ["<", ">", "'"]

found_danger = False

index = 0
while index < len(user_input):
    ch = user_input[index]

    if ch in dangerous_chars:
        print(f"危険な文字 '{ch}' が見つかりました(位置: {index})")
        found_danger = True
        break  # これ以上チェックする前に止める
    index += 1

if not found_danger:
    print("危険な文字は見つかりませんでした")
Python

ここでは、「危険な文字が見つかったら、すぐにループを抜ける」という動きを break で表現しています。 実際のシステムでは、見つかった後にエスケープや拒否などの処理を行いますが、「見つかった時点でループを止める」という発想は同じです。

continue ― 「その回だけ“残りをスキップして”、次のループに進む」

continue は、「今のループの残りの処理をスキップして、次の繰り返しに進む」ためのキーワードです。 break が「ループ全体を抜ける」のに対して、continue は「その1回分だけ途中で終わらせる」という違いがあります。

基本的な例を見てみます。

# continueの基本

count = 0

while count < 5:
    count += 1  # 先に1増やしておく

    if count == 3:
        print("countが3なので、この回はスキップします")
        continue  # ここで残りの処理をスキップして次のループへ

    print(f"countの値: {count}")
Python

このコードの動きはこうです。

  • count が 1のとき → continue は実行されず、print() が実行されます。
  • count が 2のとき → 同じく print() が実行されます。
  • count が 3のとき → continue が実行され、print() はスキップされます。
  • count が 4, 5のとき → 再び print() が実行されます。

結果として、「3のときだけ表示をスキップする」という動きになります。

セキュリティ寄りのイメージとして、「特定の条件に当てはまるものだけスキップする」例を見てみます。

# ブラックリストに載っているユーザーはスキップするイメージ

users = ["alice", "bob", "evil_user", "charlie"]
blacklist = ["evil_user"]

index = 0
while index < len(users):
    user = users[index]

    if user in blacklist:
        print(f"ブラックリストユーザー {user} をスキップします")
        index += 1
        continue  # このユーザーの処理は行わず、次へ

    print(f"通常ユーザー {user} を処理します")
    # ここに通常の処理を書くイメージです

    index += 1
Python

ここでは、「ブラックリストに載っているユーザーだけ処理をスキップする」という動きを continue で表現しています。 continue は、「この回だけ特別扱いしたい(処理しない・別の経路にしたい)」ときに便利です。

Day 7のまとめと次へのつながり

Day 7では、

  • while:条件がTrueの間、同じブロックを繰り返す
  • 無限ループ:while True: で終わりのないループを作る(ただし必ず抜け道を用意する)
  • break:ループを途中で完全に抜ける
  • continue:その回だけ残りの処理をスキップして、次のループに進む

を学びました。

ここまで理解できると、「いつ終わるかが条件次第で変わる処理」を安全に書けるようになります。 次のステップでは、for文とwhile文を使い分けながら、リスト・辞書・ファイル・ログなど、さまざまなデータを繰り返し処理する実践的なコードに進んでいきます。

Day 7で特に重要なのは、「whileは“条件が続く限り動き続けるエンジン”であり、breakcontinue はそのエンジンの“止め方・流れの変え方”だ」という感覚です。 この感覚が身につくと、セキュリティ的にも「暴走しないループ」「危険な状態で止めるループ」「特定のものだけスキップするループ」を、意識的に設計できるようになっていきます。


Day 7:while文で「数当てゲーム」を作る

Day 7の制作編では、「数当てゲーム」を題材にして、while文・無限ループ・break・continueを実際のコードの中で使っていきます。 ゲームという形にすることで、「条件が続く限り繰り返す」「正解したら抜ける」「不正な入力はスキップする」といった動きを、自然な流れで理解できるようになります。

数当てゲームの全体イメージをつかむ

まず、「数当てゲームでやりたいこと」を整理します。

  • コンピュータが1〜100の間の秘密の数字を1つ決める
  • プレイヤーが数字を入力して当てようとする
  • 当たるまで何度でもチャレンジできる
  • 入力した数字が小さすぎるか大きすぎるかをヒントとして表示する
  • 正解したら「おめでとう!」と表示してゲーム終了

この「当たるまで何度でもチャレンジできる」という部分が、まさにwhile文の出番です。 さらに、「ゲームを続けるかやめるか」を選べるようにして、無限ループ+breakのパターンも体験していきます。

while文で「当たるまで繰り返す」ループを書く

まずは、1回だけ遊べるシンプルな数当てゲームを書いてみます。 ここでは、while を使って「正解するまで繰り返す」ループを作ります。

import random  # 乱数を使うための標準ライブラリ

# 1〜100の間で秘密の数字をランダムに決めます
secret_number = random.randint(1, 100)

print("数当てゲームを始めます!1〜100の数字を当ててください。")

# プレイヤーが当てるまで繰り返すループ
while True:
    # ユーザーから入力を受け取ります(文字列として)
    guess_text = input("数字を入力してください: ")

    # 入力が数字かどうかをチェックします
    if not guess_text.isdigit():
        print("数字を入力してください。")
        # 不正な入力なので、この回はやり直し(次のループへ)
        continue

    # 文字列を整数に変換します
    guess = int(guess_text)

    # 当たりかどうかを判定します
    if guess == secret_number:
        print("正解です!おめでとうございます!")
        # 正解したのでループを抜けてゲーム終了
        break
    elif guess < secret_number:
        print("もっと大きい数字です。")
    else:
        print("もっと小さい数字です。")
Python

ここでのポイントを整理します。

  • while True: 条件が常にTrueなので、これは「無限ループ」です。 ただし、正解したときに break で抜けるので、実際には永遠には続きません。
  • continue 入力が数字でない場合、「この回の残りの処理をスキップして、次の入力に進む」ために使っています。 不正な入力を安全にスキップするイメージです。
  • break 正解したときに「ゲームを終了する」ために使っています。 ループ全体を抜けて、プログラムの次の処理に進みます。

このコードだけでも、while・無限ループ・break・continueの基本的な使い方がすべて入っています。

無限ループ+breakで「何度でも遊べる」ゲームにする

次に、「ゲームを何度でも遊べる」ようにしてみます。 ここでは、外側にもう1つ while True: を置いて、「ゲーム全体のループ」を作ります。

import random

print("数当てゲームへようこそ!")

while True:  # ゲーム全体の無限ループ(あとでbreakで抜けます)
    # 1〜100の間で秘密の数字を決める
    secret_number = random.randint(1, 100)
    print("新しいゲームを始めます。1〜100の数字を当ててください。")

    # 当たるまで繰り返すループ
    while True:
        guess_text = input("数字を入力してください: ")

        # 入力チェック(数字かどうか)
        if not guess_text.isdigit():
            print("数字を入力してください。")
            continue  # この回はスキップして次の入力へ

        guess = int(guess_text)

        if guess == secret_number:
            print("正解です!おめでとうございます!")
            break  # このゲームを終了(内側のループを抜ける)
        elif guess < secret_number:
            print("もっと大きい数字です。")
        else:
            print("もっと小さい数字です。")

    # ここに来た時点で、1ゲーム分が終わっています
    # 続けるかどうかを聞きます
    again = input("もう一度遊びますか? (y/n): ")

    if again.lower() != "y":
        print("ゲームを終了します。遊んでくれてありがとうございました!")
        break  # 外側のループを抜けて、プログラム全体を終了
Python

この構造では、

  • 外側の while True: が「ゲーム全体の無限ループ」
  • 内側の while True: が「1ゲーム分の無限ループ(当たるまで)」
  • 内側の break が「1ゲーム分の終了」
  • 外側の break が「ゲーム全体の終了」

という役割を持っています。

無限ループは一見危険そうですが、「必ずどこかで break する条件を用意する」ことで、 「必要な間だけ動き続ける安全なループ」にできます。

continueで「不正な入力をスキップする」動きを深掘りする

数当てゲームでは、「数字以外の入力」を受け取ったときに、 その回の処理をスキップして次の入力に進む必要があります。 ここで continue が活躍します。

guess_text = input("数字を入力してください: ")

if not guess_text.isdigit():
    print("数字を入力してください。")
    continue  # この回の残りの処理をスキップして、次のループへ
Python

この部分の流れはこうです。

  1. ユーザーから入力を受け取る(文字列)
  2. isdigit() で「すべて数字かどうか」をチェックする
  3. 数字でない場合は、エラーメッセージを表示する
  4. continue によって、「この回の残り(正解判定など)を実行せずに、次の入力に進む」

もし continue を使わずに進めてしまうと、 int(guess_text) のところでエラーになり、プログラムが止まってしまいます。 continue は、「この回は処理できないから、次の回に進もう」という安全なスキップのためのスイッチです。

セキュリティの観点でも、「不正な入力を検出したら、その入力を処理しないで次に進む」という動きは非常に重要です。 数当てゲームはシンプルですが、「入力チェック+continue」というパターンは、 実際のWebアプリやAPIでもよく使われる考え方です。

数当てゲームの完成版コード(コメント付き)

最後に、ここまでの内容をまとめた「数当てゲーム」の完成版コードを示します。 コメントを多めに入れて、初心者の方にも読みやすい形にしています。

import random  # 乱数を使うための標準ライブラリ

print("数当てゲームへようこそ!")

# ゲーム全体のループ(何度でも遊べるようにする)
while True:
    # 1〜100の間で秘密の数字をランダムに決めます
    secret_number = random.randint(1, 100)
    print("新しいゲームを始めます。1〜100の数字を当ててください。")

    # このゲームの中で、正解するまで繰り返すループ
    while True:
        # ユーザーから入力を受け取ります
        guess_text = input("数字を入力してください: ")

        # 入力が数字かどうかをチェックします
        if not guess_text.isdigit():
            print("数字のみを入力してください。")
            # 不正な入力なので、この回はスキップして次の入力へ
            continue

        # 文字列を整数に変換します
        guess = int(guess_text)

        # 正解判定
        if guess == secret_number:
            print("正解です!おめでとうございます!")
            # 正解したので、このゲームのループを終了します
            break
        elif guess < secret_number:
            print("もっと大きい数字です。")
        else:
            print("もっと小さい数字です。")

    # ここに来た時点で、1ゲーム分が終わっています
    # 続けるかどうかをユーザーに確認します
    again = input("もう一度遊びますか? (y/n): ")

    # 小文字にそろえて判定します
    if again.lower() != "y":
        print("ゲームを終了します。遊んでくれてありがとうございました!")
        # ゲーム全体のループを抜けて、プログラムを終了します
        break
Python

Day 7(制作編)のまとめ

Day 7の制作編では、「数当てゲーム」を通して、

  • while で「条件が続く限り繰り返す」ループを作る
  • while True: で「無限ループ」を作り、break で安全に抜ける
  • continue で「不正な入力や特定の条件のときに、その回の処理をスキップする」
  • 入力チェックとループ制御を組み合わせて、「止まらず・暴走せず・安全に動く」ゲームを作る

という流れを体験していただきました。

この数当てゲームはシンプルですが、 「while+無限ループ+break+continue」という、実務でも頻出のパターンがすべて詰まっています。 この感覚を土台に、今後はログ監視ループ、サーバーのメインループ、入力受付ループなど、 より現実的な場面でも「安全に動き続けるループ」を設計できるようになっていきます。

タイトルとURLをコピーしました