🔁 ステップ14: while文とループ制御
条件が満たされている間、ずっと繰り返すループをマスターしよう!
前のステップでは、for文を使って「決まった回数」や「リストの要素の数だけ」繰り返す方法を学びました。今回は、「条件が満たされている間ずっと」繰り返すwhile文を学びます。
📖 このステップで学ぶこと
・while文の基本構文と使い方
・無限ループとその対処法
・breakでループを途中で抜ける方法
・continueで繰り返しをスキップする方法
・ループの入れ子(ネスト)
・for文とwhile文の使い分け
🎯 1. while文って何?
まず、while文がどんな時に必要なのかを理解しましょう。
🔰 for文との違い
for文は「回数が決まっている」繰り返しに使いました。
例えば、「5回繰り返す」「リストの要素を全部処理する」などです。
でも、こんな場面ではどうでしょうか?
📌 回数が決まっていない繰り返しの例
・ゲームで「正解するまで」問題を出し続ける → 何回で正解するか分からない
・「残高が0円になるまで」買い物を続ける → 何回買い物するか分からない
・「ユーザーが終了と入力するまで」プログラムを動かす → いつ終了するか分からない
これらは「条件が満たされている間、繰り返す」処理です。
このような「条件で制御する繰り返し」に使うのがwhile文です!
💡 for文とwhile文の使い分け
for文:繰り返す回数が決まっている時
・「5回繰り返す」「リストの要素を全部処理」など
while文:条件で制御したい時
・「正解するまで」「残高が0になるまで」など
🔰 while文のイメージ
while文は英語で「〜の間」という意味です。
日本語で言うと「〜の間、繰り返す」というイメージです。
例えば:
・「お腹が空いている間、食べ続ける」
・「雨が降っている間、待ち続ける」
・「体力がある間、走り続ける」
これらはすべて「条件がTrueの間、繰り返す」という動作です。
📝 2. while文の基本
📘 while文の書き方
📝 while文の基本構文
whileの後に条件を書き、その条件がTrueの間、処理を繰り返します。
条件の後ろにはコロン(:)を付けます。
繰り返す処理はインデント(字下げ)します。
※スマートフォンでは横スクロールできます
while 条件:
条件がTrueの間繰り返す処理
📝 シンプルなwhile文
まずは、1から5まで数字を表示するプログラムを作ってみましょう。
最初に、カウント用の変数を準備します。
コード:変数の準備
※スマートフォンでは横スクロールできます
# count = 1 は「カウンターを1に設定する」という意味
# count という名前の変数に 1 を代入している
# 1から始めたいので、初期値を1にする
count = 1
次に、while文で繰り返し処理を書きます。
コード:while文で繰り返す
※スマートフォンでは横スクロールできます
# while count <= 5: の意味
# count <= 5 → countが5以下かどうかをチェック(条件)
# この条件がTrueの間、インデントされた処理を繰り返す
while count <= 5:
print(f"{count}回目") # 現在のcountを表示
count += 1 # countを1増やす(これが重要!)
🔑 超重要!countを増やす理由
count += 1を忘れると、countがずっと1のままです。
すると、条件count <= 5がずっとTrueのままになり、無限ループになります!
while文では、条件に関わる変数を必ず変化させることが重要です。
完成コード:1から5まで表示
※スマートフォンでは横スクロールできます
# カウンターを1に設定
count = 1
# countが5以下の間、繰り返す
while count <= 5:
print(f"{count}回目")
count += 1 # countを1増やす
実行結果
1回目 2回目 3回目 4回目 5回目
💡 処理の流れを確認しよう
1. count = 1 → 条件「1 <= 5」はTrue → 「1回目」を表示 → count = 2になる
2. count = 2 → 条件「2 <= 5」はTrue → 「2回目」を表示 → count = 3になる
3. count = 3 → 条件「3 <= 5」はTrue → 「3回目」を表示 → count = 4になる
4. count = 4 → 条件「4 <= 5」はTrue → 「4回目」を表示 → count = 5になる
5. count = 5 → 条件「5 <= 5」はTrue → 「5回目」を表示 → count = 6になる
6. count = 6 → 条件「6 <= 5」はFalse → ループ終了
📝 カウントダウン
今度は5から1までカウントダウンするプログラムを作ってみましょう。
完成コード:カウントダウン
※スマートフォンでは横スクロールできます
# カウンターを5に設定(5から始める)
count = 5
# countが0より大きい間、繰り返す
while count > 0:
print(count)
count -= 1 # countを1減らす
# ループが終わったら「発射!」と表示
print("発射!")
実行結果
5 4 3 2 1 発射!
💡 ポイント
count -= 1はcount = count - 1と同じ意味です。
countが0になると、条件「0 > 0」はFalseになり、ループを抜けます。
ループを抜けた後に「発射!」が表示されます。
📝 合計が100を超えるまで足し算
1から順に数字を足していき、合計が100を超えたら終了するプログラムを作ってみましょう。
まず、使う変数を準備します。
コード:変数の準備
※スマートフォンでは横スクロールできます
# total = 0 は「合計を0に設定する」という意味
# 足し算の結果を貯める変数
total = 0
# num = 1 は「足す数字を1に設定する」という意味
# 1から順に足していくので、初期値は1
num = 1
次に、while文で合計が100未満の間、足し算を続けます。
完成コード:合計が100を超えるまで
※スマートフォンでは横スクロールできます
# 合計と足す数字を初期化
total = 0
num = 1
# 合計が100未満の間、繰り返す
while total < 100:
total += num # totalにnumを足す
print(f"{num}を追加: 合計 = {total}")
num += 1 # 次に足す数字を1増やす
print(f"\n合計が100を超えました!最終合計: {total}")
実行結果
1を追加: 合計 = 1 2を追加: 合計 = 3 3を追加: 合計 = 6 4を追加: 合計 = 10 5を追加: 合計 = 15 6を追加: 合計 = 21 7を追加: 合計 = 28 8を追加: 合計 = 36 9を追加: 合計 = 45 10を追加: 合計 = 55 11を追加: 合計 = 66 12を追加: 合計 = 78 13を追加: 合計 = 91 14を追加: 合計 = 105 合計が100を超えました!最終合計: 105
💡 このプログラムのポイント
・最初から「何回繰り返すか」は分からない
・「合計が100未満」という条件で繰り返しを制御
・合計が100を超えたらループが終了する
これがwhile文の強み!条件で繰り返しを制御できます。
📝 ユーザー入力と組み合わせる
while文はユーザー入力との組み合わせがとても便利です。
完成コード:入力が「終了」まで繰り返す
※スマートフォンでは横スクロールできます
# 最初に入力を受け取る
text = input("何か入力してください(終了で終わります): ")
# 入力が「終了」でない間、繰り返す
while text != "終了":
print(f"あなたの入力: {text}")
text = input("何か入力してください(終了で終わります): ")
print("プログラムを終了します")
実行結果
何か入力してください(終了で終わります): こんにちは あなたの入力: こんにちは 何か入力してください(終了で終わります): Python楽しい あなたの入力: Python楽しい 何か入力してください(終了で終わります): 終了 プログラムを終了します
📌 while文の基本まとめ
・while 条件:で、条件がTrueの間繰り返す
・条件の後ろにはコロン(:)を付ける
・繰り返す処理はインデントする
・条件に関わる変数を必ず変化させる(無限ループ防止)
・「回数が決まっていない繰り返し」に最適
⚠️ 3. 無限ループに注意!
while文で最も気をつけなければいけないのが無限ループです。条件がずっとTrueのままだと、プログラムが永遠に終わりません。
🔰 無限ループとは?
無限ループとは、終わらない繰り返しのことです。
while文の条件がずっとTrueのままだと、プログラムは永遠に同じ処理を繰り返し続けます。
⚠️ 無限ループの例(実行しないでください!)
以下のコードは無限ループになります。
※スマートフォンでは横スクロールできます
# ⚠️ 無限ループ!実行しないでください!
count = 1
while count <= 5:
print(f"{count}回目")
# count += 1 を忘れている!
# countがずっと1のまま、条件がずっとTrue
⚠️ なぜ無限ループになる?
countが1のまま変わらないので:
・1回目:count = 1 → 条件「1 <= 5」はTrue → 「1回目」を表示
・2回目:count = 1 → 条件「1 <= 5」はTrue → 「1回目」を表示
・3回目:count = 1 → 条件「1 <= 5」はTrue → 「1回目」を表示
・…永遠に続く…
📝 無限ループを止める方法
もし無限ループに入ってしまったら、以下の方法で強制終了できます。
📌 無限ループの止め方
| 環境 | 止め方 |
| Google Colab | ■(停止ボタン)をクリック |
| Jupyter Notebook | ■(停止ボタン)をクリック |
| コマンドライン | Ctrl + C を押す |
| VS Code | ターミナルで Ctrl + C |
📝 無限ループを防ぐコツ
💡 無限ループを防ぐ3つのコツ
1. 条件に関わる変数を必ず変化させる
→ countを増やす、減らすなど
2. テストは小さい数から始める
→ いきなり1000回ではなく、3回や5回でテスト
3. ループを抜ける条件を明確にする
→ 「いつループが終わるか」を意識する
🔓 4. break – ループを途中で抜ける
breakを使うと、ループを途中で終了できます。条件がTrueでも、breakに到達したらループを抜けます。
🔰 breakの基本
breakは「ループを今すぐ終了する」という命令です。
例えば、1から10まで数えるつもりが、5に到達したら終了したい場合に使います。
完成コード:5に到達したら終了
※スマートフォンでは横スクロールできます
# カウンターを1に設定
count = 1
# countが10以下の間、繰り返す
while count <= 10:
print(count)
# countが5になったらループを終了
if count == 5:
print("5に到達したので終了!")
break # ここでループを抜ける
count += 1
実行結果
1 2 3 4 5 5に到達したので終了!
💡 breakの動作
・breakに到達すると、即座にループを抜けます
・breakより下の処理は実行されません
・while文の条件がTrueでも、breakで強制終了できます
📝 while True と break の組み合わせ
実は、while文では「while True」と「break」の組み合わせがよく使われます。
「while True」は条件が常にTrueなので、そのままでは無限ループになります。でも、breakを使えば安全に制御できます。
📝 while True: と break の使い方
while True:で無限ループを作り、特定の条件でbreakで抜けます。
「終了条件が複雑な時」や「最初に条件をチェックしにくい時」に便利です。
完成コード:パスワード入力(正解するまで繰り返す)
※スマートフォンでは横スクロールできます
# while True: は無限ループ(条件が常にTrue)
# breakで抜けないと永遠に続く
while True:
# パスワードを入力してもらう
password = input("パスワードを入力: ")
# 正しいパスワードかチェック
if password == "python123":
print("ログイン成功!")
break # 正解したらループを抜ける
else:
print("パスワードが違います。もう一度試してください。")
実行結果
パスワードを入力: abc パスワードが違います。もう一度試してください。 パスワードを入力: hello パスワードが違います。もう一度試してください。 パスワードを入力: python123 ログイン成功!
💡 while True: と break のメリット
・「正解するまで繰り返す」のような処理に最適
・終了条件をif文の中で書けるので、コードが分かりやすい
・breakがあれば無限ループにはならないので安全
📝 実践例:数当てゲーム
while Trueとbreakを使って、数当てゲームを作ってみましょう。
まず、正解の数字をランダムに決めます。
コード:正解の数字を準備
※スマートフォンでは横スクロールできます
# import random でランダムな数を生成するモジュールを読み込む
import random
# random.randint(1, 10) で1から10の間のランダムな整数を生成
# この数字が正解となる
answer = random.randint(1, 10)
# 挑戦回数をカウントする変数
attempts = 0
完成コード:数当てゲーム
※スマートフォンでは横スクロールできます
import random
# 1から10のランダムな数字を正解として設定
answer = random.randint(1, 10)
# 挑戦回数
attempts = 0
print("1から10の数字を当ててね!")
# 正解するまで繰り返す
while True:
# ユーザーの予想を入力
guess = int(input("予想: "))
# 挑戦回数を増やす
attempts += 1
# 正解かどうかチェック
if guess == answer:
print(f"正解! {attempts}回で当てました!")
break # 正解したらループを抜ける
elif guess < answer:
print("もっと大きい数です")
else:
print("もっと小さい数です")
実行結果の例
1から10の数字を当ててね! 予想: 5 もっと大きい数です 予想: 8 もっと小さい数です 予想: 7 正解! 3回で当てました!
📝 回数制限付きのパスワード入力
パスワード入力を3回までに制限するプログラムを作ってみましょう。
完成コード:3回まで挑戦できるパスワード入力
※スマートフォンでは横スクロールできます
# 正しいパスワード
correct_password = "abc123"
# 挑戦回数
attempts = 0
# 最大挑戦回数
max_attempts = 3
# 挑戦回数が3回未満の間、繰り返す
while attempts < max_attempts:
# パスワードを入力
password = input("パスワード: ")
# 挑戦回数を増やす
attempts += 1
# 正しいパスワードかチェック
if password == correct_password:
print("ログイン成功!")
break # 正解したらループを抜ける
else:
# 残り回数を計算
remaining = max_attempts - attempts
if remaining > 0:
print(f"間違っています。残り{remaining}回")
else:
print("ロックされました")
実行結果(3回失敗した場合)
パスワード: aaa 間違っています。残り2回 パスワード: bbb 間違っています。残り1回 パスワード: ccc ロックされました
実行結果(2回目で正解した場合)
パスワード: aaa 間違っています。残り2回 パスワード: abc123 ログイン成功!
📌 breakのまとめ
・breakはループを即座に終了する
・while文の条件がTrueでも、breakで強制終了できる
・while True:とbreakの組み合わせがよく使われる
・「正解するまで」「特定の条件になるまで」の処理に便利
⏭️ 5. continue – その回をスキップ
continueを使うと、その回の残りの処理をスキップして、次の繰り返しに進みます。
🔰 continueとbreakの違い
breakとcontinueは似ているようで、動作が全く違います。
📌 breakとcontinueの違い
| 命令 | 動作 | ループは? |
break |
ループを完全に終了する | 終了する |
continue |
今回の繰り返しだけスキップ | 続く |
💡 イメージで理解しよう
break:「もうやめた!」→ ループ自体を終了
continue:「この回は飛ばして、次に行こう」→ ループは続く
📝 continueの基本例
1から10までの数字のうち、偶数だけスキップして奇数だけ表示するプログラムを作ってみましょう。
完成コード:奇数だけ表示
※スマートフォンでは横スクロールできます
# カウンターを0に設定
count = 0
# countが10未満の間、繰り返す
while count < 10:
count += 1 # まずcountを増やす(重要!)
# 偶数かどうかチェック
# count % 2 == 0 → 2で割った余りが0なら偶数
if count % 2 == 0:
continue # 偶数ならスキップして次の繰り返しへ
# continueで飛ばされなかった場合のみ実行される
print(count)
実行結果
1 3 5 7 9
💡 処理の流れを確認しよう
count = 1:奇数 → print(1) が実行される
count = 2:偶数 → continue でスキップ、print()は実行されない
count = 3:奇数 → print(3) が実行される
count = 4:偶数 → continue でスキップ、print()は実行されない
…以下同様…
🔑 重要!countを増やす位置
このコードでは、count += 1をcontinueより前に書いています。
もしcontinueの後に書くと、countが増えずに無限ループになります!
continueを使う時は、変数を変化させる位置に注意しましょう。
📝 入力チェックでcontinueを使う
continueは「不正な入力を無視して、やり直す」という場面でよく使います。
完成コード:正の数だけ受け付ける(5個まで)
※スマートフォンでは横スクロールできます
# 合計と入力回数を初期化
total = 0
count = 0
print("正の数を5個入力してください")
# 5個入力するまで繰り返す
while count < 5:
# 数字を入力
num = int(input(f"{count + 1}個目: "))
# 0以下の数字かチェック
if num <= 0:
print("正の数を入力してください!")
continue # 最初からやり直し(countは増えない)
# 正の数なら合計に加えて、カウントを増やす
total += num
count += 1
print(f"\n合計: {total}")
実行結果
正の数を5個入力してください 1個目: 10 2個目: -5 正の数を入力してください! 2個目: 20 3個目: 0 正の数を入力してください! 3個目: 15 4個目: 25 5個目: 30 合計: 100
💡 このプログラムのポイント
・0以下の数字が入力されたら、continueでやり直し
・continueの時はcountが増えないので、同じ「〇個目」が再表示される
・正の数が入力された時だけcountが増える
・必ず5個の正の数が入力される
📝 breakとcontinueの比較
breakとcontinueの違いを、同じプログラムで比較してみましょう。
コード:breakを使った場合
※スマートフォンでは横スクロールできます
# breakを使った場合
count = 0
while count < 5:
count += 1
if count == 3:
print("breakでループ終了!")
break # ループを完全に終了
print(f"count = {count}")
実行結果(break)
count = 1 count = 2 breakでループ終了!
→ 3でループが終了し、4と5は実行されない
コード:continueを使った場合
※スマートフォンでは横スクロールできます
# continueを使った場合
count = 0
while count < 5:
count += 1
if count == 3:
print("continueで3をスキップ!")
continue # この回だけスキップ
print(f"count = {count}")
実行結果(continue)
count = 1 count = 2 continueで3をスキップ! count = 4 count = 5
→ 3だけスキップされ、4と5は実行される
🔄 6. ループの入れ子(ネスト)
while文の中に、さらにwhile文やfor文を書くことができます。これを「入れ子」または「ネスト」といいます。
🔰 入れ子のイメージ
入れ子ループは「二重のループ」です。
例えば:
・外側のループが「1年生、2年生、3年生」
・内側のループが「1組、2組」
という構造を考えると、「1年1組、1年2組、2年1組、2年2組、3年1組、3年2組」という順番で処理されます。
📝 while文の入れ子
完成コード:while文の入れ子
※スマートフォンでは横スクロールできます
# 外側のループ用カウンター
i = 1
# 外側のループ(3回繰り返す)
while i <= 3:
print(f"外側のループ: {i}")
# 内側のループ用カウンター(外側のループごとにリセット)
j = 1
# 内側のループ(2回繰り返す)
while j <= 2:
print(f" 内側のループ: {j}")
j += 1 # 内側のカウンターを増やす
i += 1 # 外側のカウンターを増やす
実行結果
外側のループ: 1 内側のループ: 1 内側のループ: 2 外側のループ: 2 内側のループ: 1 内側のループ: 2 外側のループ: 3 内側のループ: 1 内側のループ: 2
💡 処理の流れ
1. i = 1:外側1回目 → 内側が2回実行される
2. i = 2:外側2回目 → 内側が2回実行される
3. i = 3:外側3回目 → 内側が2回実行される
内側のループは、外側の各回で「最初から」実行されます(jがリセットされる)。
📝 whileとforの組み合わせ
while文の中にfor文を入れることもできます。
完成コード:エクササイズのセット管理
※スマートフォンでは横スクロールできます
# セット数のカウンター
set_count = 1
# 3セット繰り返す
while set_count <= 3:
print(f"--- セット{set_count} ---")
# 各セットで3回エクササイズ(forを使用)
for i in range(1, 4):
print(f" エクササイズ {i}")
set_count += 1
print("\nトレーニング終了!")
実行結果
--- セット1 --- エクササイズ 1 エクササイズ 2 エクササイズ 3 --- セット2 --- エクササイズ 1 エクササイズ 2 エクササイズ 3 --- セット3 --- エクササイズ 1 エクササイズ 2 エクササイズ 3 トレーニング終了!
📝 九九の表を作る
入れ子ループの実用例として、九九の表を作ってみましょう。
完成コード:九九の表
※スマートフォンでは横スクロールできます
# 外側のループ(1の段から9の段まで)
i = 1
while i <= 9:
# 内側のループ(1から9まで掛ける)
j = 1
while j <= 9:
# end=" " で改行せずにスペースで区切る
# :2 で2桁分のスペースを確保(見やすくするため)
print(f"{i * j:2}", end=" ")
j += 1
# 1つの段が終わったら改行
print()
i += 1
実行結果
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
📌 入れ子のbreakについて
入れ子のループでbreakを使うと、内側のループだけを抜けます。
外側のループは続きます。
全てのループを抜けたい時は、フラグ変数を使うか、関数にしてreturnを使います。
🎯 7. 実践的な例
ここまで学んだwhile文、break、continueを使って、実用的なプログラムを作ってみましょう。
例1: 簡単な計算機
ユーザーが「q」を入力するまで計算を続ける計算機を作ります。
📌 計算機の仕様
・四則演算(+, -, *, /)ができる
・「q」を入力すると終了
・間違った演算子を入力したらやり直し
・0での割り算はエラーメッセージを表示
完成コード:簡単な計算機
※スマートフォンでは横スクロールできます
print("=== 簡単な計算機 ===")
print("終了するには 'q' を入力")
# 無限ループ(qが入力されるまで続く)
while True:
# 演算子を入力
operation = input("\n演算(+, -, *, /, q): ")
# qが入力されたら終了
if operation == 'q':
print("計算機を終了します")
break
# 正しい演算子かチェック
if operation not in ['+', '-', '*', '/']:
print("正しい演算子を入力してください")
continue # 最初からやり直し
# 2つの数字を入力
num1 = float(input("1つ目の数: "))
num2 = float(input("2つ目の数: "))
# 演算を実行
if operation == '+':
result = num1 + num2
elif operation == '-':
result = num1 - num2
elif operation == '*':
result = num1 * num2
elif operation == '/':
# 0での割り算をチェック
if num2 == 0:
print("エラー:0では割れません")
continue
result = num1 / num2
print(f"結果: {num1} {operation} {num2} = {result}")
実行結果の例
=== 簡単な計算機 === 終了するには 'q' を入力 演算(+, -, *, /, q): + 1つ目の数: 10 2つ目の数: 5 結果: 10.0 + 5.0 = 15.0 演算(+, -, *, /, q): / 1つ目の数: 20 2つ目の数: 0 エラー:0では割れません 演算(+, -, *, /, q): q 計算機を終了します
例2: 残高管理システム
残高が0円になるまで買い物ができるシステムを作ります。
完成コード:残高管理システム
※スマートフォンでは横スクロールできます
# 初期残高を設定
balance = 10000
print("=== 残高管理システム ===")
print(f"初期残高: {balance}円")
# 残高が0より大きい間、繰り返す
while balance > 0:
print(f"\n現在の残高: {balance}円")
# 使用金額を入力
amount = int(input("使用金額(0で終了): "))
# 0が入力されたら終了
if amount == 0:
print("終了します")
break
# マイナスの金額をチェック
if amount < 0:
print("正の金額を入力してください")
continue
# 残高不足をチェック
if amount > balance:
print("残高不足です!")
continue
# 残高から引く
balance -= amount
print(f"{amount}円使いました")
# ループが終わった後
if balance == 0:
print("\n残高が0円になりました!")
else:
print(f"\n最終残高: {balance}円")
実行結果の例
=== 残高管理システム === 初期残高: 10000円 現在の残高: 10000円 使用金額(0で終了): 3000 3000円使いました 現在の残高: 7000円 使用金額(0で終了): 8000 残高不足です! 現在の残高: 7000円 使用金額(0で終了): 7000 7000円使いました 残高が0円になりました!
例3: メニュー選択システム
よくあるメニュー画面を持つプログラムを作ります。
完成コード:メニュー選択システム
※スマートフォンでは横スクロールできます
# ユーザー情報
user_name = "太郎"
user_level = 5
# メインループ
while True:
# メニューを表示
print("\n=== メニュー ===")
print("1. プロフィール表示")
print("2. レベルアップ")
print("3. ステータス確認")
print("4. 終了")
# 選択を入力
choice = input("選択(1-4): ")
if choice == '1':
print(f"\n【プロフィール】")
print(f"名前: {user_name}")
print(f"レベル: {user_level}")
elif choice == '2':
user_level += 1
print(f"\nレベルアップ! 現在のレベル: {user_level}")
elif choice == '3':
print(f"\n【ステータス】")
print(f"HP: {user_level * 100}")
print(f"攻撃力: {user_level * 10}")
print(f"防御力: {user_level * 5}")
elif choice == '4':
print("\nゲームを終了します。またね!")
break
else:
print("\n1-4の数字を入力してください")
実行結果の例
=== メニュー === 1. プロフィール表示 2. レベルアップ 3. ステータス確認 4. 終了 選択(1-4): 1 【プロフィール】 名前: 太郎 レベル: 5 === メニュー === 1. プロフィール表示 2. レベルアップ 3. ステータス確認 4. 終了 選択(1-4): 2 レベルアップ! 現在のレベル: 6 === メニュー === 1. プロフィール表示 2. レベルアップ 3. ステータス確認 4. 終了 選択(1-4): 4 ゲームを終了します。またね!
例4: 平均点計算プログラム
0が入力されるまで点数を受け取り、平均点を計算するプログラムです。
完成コード:平均点計算
※スマートフォンでは横スクロールできます
# 合計と入力回数を初期化
total = 0
count = 0
print("=== 平均点計算 ===")
print("点数を入力してください(0で終了)")
# 無限ループ
while True:
# 点数を入力
score = int(input("点数: "))
# 0が入力されたら終了
if score == 0:
break
# 0〜100の範囲外をチェック
if score < 0 or score > 100:
print("0〜100の点数を入力してください")
continue
# 合計に加算し、カウントを増やす
total += score
count += 1
print(f" → 現在 {count}科目、合計 {total}点")
# 結果を表示
print("\n=== 結果 ===")
if count > 0:
average = total / count
print(f"科目数: {count}")
print(f"合計点: {total}")
print(f"平均点: {average:.1f}")
else:
print("点数が入力されませんでした")
実行結果の例
=== 平均点計算 === 点数を入力してください(0で終了) 点数: 80 → 現在 1科目、合計 80点 点数: 75 → 現在 2科目、合計 155点 点数: 150 0〜100の点数を入力してください 点数: 90 → 現在 3科目、合計 245点 点数: 0 === 結果 === 科目数: 3 合計点: 245 平均点: 81.7
例5: フィボナッチ数列
フィボナッチ数列を、値が100を超えるまで表示するプログラムです。
📌 フィボナッチ数列とは?
前の2つの数字を足した数字が次の数字になる数列です。
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …
(1+1=2, 1+2=3, 2+3=5, 3+5=8, …)
完成コード:フィボナッチ数列
※スマートフォンでは横スクロールできます
# 最初の2つの数字を設定
a = 1 # 1つ前の数字
b = 1 # 現在の数字
print("フィボナッチ数列(100まで):")
# aが100以下の間、繰り返す
while a <= 100:
# 現在の数字を表示(end=" "で改行せずスペース区切り)
print(a, end=" ")
# 次の数字を計算
# a, b = b, a + b は同時代入
# 新しいa = 今のb
# 新しいb = 今のa + 今のb
a, b = b, a + b
print() # 最後に改行
実行結果
フィボナッチ数列(100まで): 1 1 2 3 5 8 13 21 34 55 89
💡 同時代入について
a, b = b, a + bは「同時代入」と呼ばれるPythonの便利な書き方です。
右辺が先に計算され、その結果が左辺に同時に代入されます。
普通に書くと以下のようになります:
※スマートフォンでは横スクロールできます
# 同時代入を使わない場合
temp = a # aの値を一時保存
a = b # aにbの値を代入
b = temp + b # bに元のa + bの値を代入
📌 実践例のまとめ
・while True + break:ユーザーが終了するまで続くプログラムに最適
・continue:不正な入力を無視してやり直す時に便利
・条件付きwhile:残高や合計など、値が変化する条件に使う
・フラグ変数:複雑な終了条件を管理する時に使う
📝 練習問題(12問)
ここまで学んだことを実際に手を動かして確認しましょう。
問題1:10から1までカウントダウン(初級)
📋 問題
while文を使って、10から1まで数字を表示しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
# カウンターを10に設定
count = 10
# countが1以上の間、繰り返す
while count >= 1:
print(count)
count -= 1 # countを1減らす
実行結果
10 9 8 7 6 5 4 3 2 1
問題2:入力が「終了」まで繰り返す(初級)
📋 問題
ユーザーが「終了」と入力するまで、入力した文字をそのまま表示し続けるプログラムを作りましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
# 無限ループ
while True:
# テキストを入力
text = input("入力: ")
# 「終了」なら終了
if text == "終了":
print("プログラムを終了します")
break
# 入力した文字を表示
print(f"あなたの入力: {text}")
実行結果
入力: こんにちは あなたの入力: こんにちは 入力: Python楽しい あなたの入力: Python楽しい 入力: 終了 プログラムを終了します
問題3:合計が50を超えるまで(初級)
📋 問題
1から順に数字を足していき、合計が50を超えたら終了するプログラムを作りましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
# 合計と足す数字を初期化
total = 0
num = 1
# 合計が50以下の間、繰り返す
while total <= 50:
total += num # 合計にnumを足す
print(f"{num}を追加: 合計 = {total}")
num += 1 # 次に足す数字を増やす
print(f"合計が50を超えました!")
実行結果
1を追加: 合計 = 1 2を追加: 合計 = 3 3を追加: 合計 = 6 4を追加: 合計 = 10 5を追加: 合計 = 15 6を追加: 合計 = 21 7を追加: 合計 = 28 8を追加: 合計 = 36 9を追加: 合計 = 45 10を追加: 合計 = 55 合計が50を超えました!
問題4:正の数だけ受け付ける(中級)
📋 問題
正の数が入力されるまで繰り返し入力を求め、正の数が入力されたら「正の数です」と表示して終了しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
# 無限ループ
while True:
# 数字を入力
num = int(input("数字を入力: "))
# 正の数かチェック
if num > 0:
print("正の数です")
break
else:
print("正の数を入力してください")
実行結果
数字を入力: -5 正の数を入力してください 数字を入力: 0 正の数を入力してください 数字を入力: 10 正の数です
問題5:5の倍数だけ表示(中級)
📋 問題
1から50までの数字の中で、5の倍数だけを表示しましょう。(while文とcontinueを使って)
解答を見る
コード(continueを使用)
※スマートフォンでは横スクロールできます
# カウンターを0に設定
num = 0
# 50まで繰り返す
while num < 50:
num += 1 # まずnumを増やす
# 5の倍数でなければスキップ
if num % 5 != 0:
continue
print(num)
実行結果
5 10 15 20 25 30 35 40 45 50
💡 別解(シンプル版)
※スマートフォンでは横スクロールできます
# 5から始めて5ずつ増やす
num = 5
while num <= 50:
print(num)
num += 5
問題6:パスワードロック(3回まで)(中級)
📋 問題
パスワード入力を3回まで受け付け、正解なら「ログイン成功」、3回失敗したら「ロックされました」と表示しましょう。
正しいパスワード: “abc123”
解答を見る
コード
※スマートフォンでは横スクロールできます
# 正しいパスワード
correct_password = "abc123"
# 挑戦回数
attempts = 0
# 3回未満の間、繰り返す
while attempts < 3:
# パスワードを入力
password = input("パスワード: ")
attempts += 1
# 正解かチェック
if password == correct_password:
print("ログイン成功!")
break
else:
remaining = 3 - attempts
if remaining > 0:
print(f"間違っています。残り{remaining}回")
else:
print("ロックされました")
実行結果(失敗した場合)
パスワード: aaa 間違っています。残り2回 パスワード: bbb 間違っています。残り1回 パスワード: ccc ロックされました
問題7:平均計算プログラム(中級)
📋 問題
0が入力されるまで数字を受け取り続け、0が入力されたら平均を表示するプログラムを作りましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
# 合計と入力回数を初期化
total = 0
count = 0
print("数字を入力してください(0で終了)")
# 無限ループ
while True:
num = int(input("数字: "))
# 0が入力されたら終了
if num == 0:
break
# 合計に加算し、カウントを増やす
total += num
count += 1
# 結果を表示
if count > 0:
average = total / count
print(f"平均: {average}")
else:
print("数字が入力されませんでした")
実行結果
数字を入力してください(0で終了) 数字: 10 数字: 20 数字: 30 数字: 0 平均: 20.0
問題8:最大値を見つける(中級)
📋 問題
-1が入力されるまで数字を受け取り続け、その中の最大値を表示しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
# 最大値を保存する変数(まだ何も入力されていない状態)
max_num = None
print("数字を入力してください(-1で終了)")
# 無限ループ
while True:
num = int(input("数字: "))
# -1が入力されたら終了
if num == -1:
break
# 最大値を更新
# max_num is None → まだ最大値がない場合
# num > max_num → 新しい数字が今の最大値より大きい場合
if max_num is None or num > max_num:
max_num = num
# 結果を表示
if max_num is not None:
print(f"最大値: {max_num}")
else:
print("数字が入力されませんでした")
実行結果
数字を入力してください(-1で終了) 数字: 5 数字: 12 数字: 8 数字: 3 数字: -1 最大値: 12
問題9:フィボナッチ数列(100まで)(上級)
📋 問題
フィボナッチ数列を、値が100を超えるまで表示しましょう。
フィボナッチ数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …
解答を見る
コード
※スマートフォンでは横スクロールできます
# 最初の2つの数字
a, b = 1, 1
# aが100以下の間、繰り返す
while a <= 100:
print(a, end=" ") # 改行せずスペースで区切る
a, b = b, a + b # 次の数字を計算
print() # 最後に改行
実行結果
1 1 2 3 5 8 13 21 34 55 89
問題10:じゃんけんゲーム(上級)
📋 問題
ユーザーとコンピューターでじゃんけんをして、ユーザーが勝つまで繰り返すプログラムを作りましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
import random
# 選択肢のリスト
hands = ["グー", "チョキ", "パー"]
print("勝つまでじゃんけん!")
# 無限ループ(勝つまで続く)
while True:
# ユーザーの入力
user = input("\nグー、チョキ、パー: ")
# 正しい入力かチェック
if user not in hands:
print("正しく入力してください")
continue
# コンピューターの手をランダムに決める
computer = random.choice(hands)
print(f"コンピューター: {computer}")
# 勝敗判定
if user == computer:
print("あいこ!もう一度...")
elif (user == "グー" and computer == "チョキ") or \
(user == "チョキ" and computer == "パー") or \
(user == "パー" and computer == "グー"):
print("あなたの勝ち!おめでとう!")
break
else:
print("あなたの負け...もう一度!")
実行結果の例
勝つまでじゃんけん! グー、チョキ、パー: グー コンピューター: グー あいこ!もう一度... グー、チョキ、パー: パー コンピューター: チョキ あなたの負け...もう一度! グー、チョキ、パー: グー コンピューター: チョキ あなたの勝ち!おめでとう!
問題11:素因数分解(上級)
📋 問題
数字を入力してもらい、その素因数分解を表示しましょう。
例: 12 → 2 × 2 × 3
解答を見る
コード
※スマートフォンでは横スクロールできます
# 数字を入力
n = int(input("数字を入力: "))
original = n # 元の数字を保存
# 素因数を保存するリスト
factors = []
# 2から順に割っていく
divisor = 2
# nが1より大きい間、繰り返す
while n > 1:
# nがdivisorで割り切れる間、繰り返す
while n % divisor == 0:
factors.append(divisor) # 素因数をリストに追加
n //= divisor # nをdivisorで割る
divisor += 1 # 次の数を試す
# 結果を表示
# " × ".join(map(str, factors)) でリストを「×」で繋げる
print(f"{original} = {' × '.join(map(str, factors))}")
実行結果
数字を入力: 12 12 = 2 × 2 × 3
問題12:複利計算シミュレーター(上級)
📋 問題
初期金額、年利率、目標金額を入力してもらい、何年で目標金額に達するかを計算しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
# 入力を受け取る
principal = float(input("初期金額(円): "))
rate = float(input("年利率(%): "))
target = float(input("目標金額(円): "))
# 年数と金額を初期化
years = 0
amount = principal
# 目標金額に達するまで繰り返す
while amount < target:
years += 1
# 複利計算:金額 × (1 + 利率/100)
amount = amount * (1 + rate / 100)
print(f"{years}年目: {int(amount):,}円")
print(f"\n{years}年で目標金額に達します!")
実行結果の例
初期金額(円): 1000000 年利率(%): 5 目標金額(円): 2000000 1年目: 1,050,000円 2年目: 1,102,500円 3年目: 1,157,625円 ... 14年目: 1,979,931円 15年目: 2,078,928円 15年で目標金額に達します!
❓ よくある質問
Q1: forとwhileはどう使い分ける?
for文は繰り返す回数が決まっている時に使います。
例:「5回繰り返す」「リストの要素を全部処理」
while文は条件で制御したい時に使います。
例:「正解するまで」「残高が0になるまで」
迷ったら、「何回繰り返すか分かる?」と考えてみてください。
Q2: 無限ループに入ったらどうする?
・Google Colab / Jupyter Notebook → ■(停止ボタン)をクリック
・コマンドライン / VS Code → Ctrl + C を押す
無限ループを防ぐには、ループ内で条件に関わる変数を必ず変化させましょう。
Q3: breakとcontinueの違いは?
break:ループを完全に終了する
continue:今回の繰り返しだけスキップ、ループは続く
breakは「もうやめた!」、continueは「この回は飛ばして次へ」というイメージです。
Q4: while True: は危険じゃない?
while True:自体は危険ではありません。
中でbreakやreturnを使って必ず抜ける仕組みがあれば問題ありません。
むしろ、「ユーザーが終了するまで」のような処理にはとても便利です。
Q5: 入れ子のループでbreakすると?
breakは、その直近のループだけを抜けます。外側のループは続きます。
全てのループを抜けたい時は、フラグ変数を使うか、関数にしてreturnを使います。
🎉 ステップ14のまとめ
✅ このステップで学んだこと
✓ while 条件:で条件がTrueの間繰り返す
✓ 条件に関わる変数を必ず変化させる(無限ループ防止)
✓ breakでループを途中で終了できる
✓ continueでその回だけスキップできる
✓ while True:とbreakの組み合わせが便利
✓ ループは入れ子(ネスト)にできる
✓ for文は回数が決まっている時、while文は条件で制御したい時に使う
💪 次のステップへ
while文をマスターしました!
これで、「正解するまで」「終了するまで」といった条件付きの繰り返しができるようになりました。
次のステップでは、内包表記を学びます。
リストや辞書を簡潔に作る、Pythonならではの便利な書き方をマスターしましょう!
学習メモ
Pythonプログラミング基礎 - Step 14