Python入門:ループ処理(for文、while文)
2025-10-21はじめに
今回は、プログラムに「反復処理」能力を与える「ループ処理」について学びます。ループを使うことで、同じ処理を何度も繰り返し実行できるようになり、効率的なプログラミングが可能になります。例えば、リストの全要素を処理したり、特定の条件が満たされるまで処理を続けたりする場合にループ処理が活用されます。
ループ処理の基本概念
ループ処理は、特定のコードブロックを繰り返し実行するための仕組みです。
Pythonでは主に2種類のループがあります。
- for文: 回数やコレクションの要素数が明確な場合
- while文: 条件が満たされるまで繰り返す場合
ループ処理の必要性
以下のような場面でループ処理が活躍します。
- リストのすべての要素を処理したい
- 同じ計算を複数回実行したい
- ユーザーが正しい入力をするまで繰り返しプロンプトを表示したい
- ファイルのすべての行を読み込みたい

for文の基本
基本的なfor文
for文は、シーケンス(リスト、文字列、タプルなど)や反復可能オブジェクトの要素に対して繰り返し処理を行います。
# リストの要素を順に処理
fruits = ["apple", "banana", "orange", "grape"]
for fruit in fruits:
print(fruit)
実行結果:
apple
banana
orange
grape
range()関数を使ったfor文
特定の回数だけ処理を繰り返したい場合にrange()関数を使用します。
# 0から4まで繰り返し
for i in range(5):
print(f"繰り返し回数: {i}")
# 結果:
# 繰り返し回数: 0
# 繰り返し回数: 1
# 繰り返し回数: 2
# 繰り返し回数: 3
# 繰り返し回数: 4
range()関数は、連続した数値のシーケンスを生成するために使用されます。
引数の指定方法により、以下の3通りの使い分けが可能です。
1. range(stop)
0から始まり、stopの手前で終了する連続した整数を生成します。
2. range(start, stop)
startで指定した数値から始まり、stopの手前で終了する連続した整数を生成します。
3. range(start, stop, step)
startからstopの手前まで、stepで指定した間隔(ステップ)で数値を生成します。stepは増減の幅を指定でき、負の数を指定すると減算していきます。
いずれの場合も、終了点(stop)自体は範囲に含まれない点が重要な特性です。
# 1から5まで
for i in range(1, 6):
print(i) # 1, 2, 3, 4, 5
# 0から10まで2つおき
for i in range(0, 11, 2):
print(i) # 0, 2, 4, 6, 8, 10
# 10から1まで
for i in range(10, 0, -1):
print(i) # 10, 9, 8, ..., 1
文字列に対するfor文
文字列に対してfor文を使用すると、文字列を構成する1文字1文字を先頭から順に処理することができます。このとき、各文字がループ変数に代入され、繰り返し処理が実行されます。これにより、文字列中のすべての文字に対して順次アクセスする操作を簡潔に記述できます。
# 文字列の各文字を処理
text = "Python"
for char in text:
print(char)
# 結果:
# P
# y
# t
# h
# o
# n
enumerate()関数を使ったfor文
反復処理の対象となる要素とともに、そのインデックス(番号)も同時に取得できます。デフォルトではインデックスは0から開始されますが、開始番号を引数で指定することも可能です。
- 最初のループでは、
enumerate(fruits)によりインデックスが 0から 始まります。 - 2つ目のループでは、
start=1を指定することで、インデックスを 1から 始めています。
これにより、リストなどのシーケンスの要素とその位置情報の両方が必要となる処理を、簡潔かつ効率的に記述することができます。
fruits = ["apple", "banana", "orange"]
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
# 結果:
# 0: apple
# 1: banana
# 2: orange
# インデックスを1から始める
for index, fruit in enumerate(fruits, start=1):
print(f"{index}: {fruit}")
while文の基本
基本的なwhile文
while文は、条件がTrueである限り繰り返し処理を実行します。
# カウンターを使った基本的なwhile文
count = 0
while count < 5:
print(f"カウント: {count}")
count += 1 # カウンターを増加(これを忘れると無限ループになる!)
# 結果:
# カウント: 0
# カウント: 1
# カウント: 2
# カウント: 3
# カウント: 4
ユーザー入力を使ったwhile文
条件式でユーザーからの入力を評価し、例えば「'secret'と入力されるとログイン成功!」といった終了条件を設定できます。これにより、ユーザーの動作に応じて柔軟に動作を制御するループ処理が実現します。
# ユーザーが正しい入力をするまで繰り返す
password = ""
while password != "secret":
password = input("パスワードを入力してください: ")
if password != "secret":
print("パスワードが間違っています")
print("ログイン成功!")
ループ制御文
break文
ループを途中で終了させたい場合に使用します。
# break文の例
for i in range(10):
if i == 5:
break # iが5になった時点でループ終了
print(i)
# 結果: 0, 1, 2, 3, 4
continue文
現在の繰り返しをスキップして、次の繰り返しに進みたい場合に使用します。
# continue文の例
for i in range(10):
if i % 2 == 0: # 偶数ならスキップ
continue
print(i) # 奇数のみ表示
# 結果: 1, 3, 5, 7, 9
else節
ループが正常に完了した場合(breakで中断されなかった場合)に実行されるコードを指定できます。
# for-elseの例
for i in range(5):
print(i)
else:
print("ループが正常に完了しました")
# 結果:
# 0
# 1
# 2
# 3
# 4
# ループが正常に完了しました
# breakがある場合
for i in range(5):
if i == 3:
break
print(i)
else:
print("このメッセージは表示されない")
# 結果: 0, 1, 2
ネストしたループ
ループの中に別のループを記述することができます。
外側のループ for i in range(1, 10) が段(1〜9)を、内側のループ for j in range(1, 10) が掛けられる数を表します。print(f"{i * j:2d}", end=" ") により、計算結果を2桁幅で整列して横並びに表示し、内側のループが終わるたびに print() で改行して表形式に整えています。
# 九九の表を作成
print("九九の表:")
for i in range(1, 10):
for j in range(1, 10):
print(f"{i * j:2d}", end=" ") # 2桁で表示
print() # 改行
# 結果:
# 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
# ...(以下続く)
実践的な例
リストの操作
for文やwhile文を使用することで、リスト内の全要素に対して順次アクセスし、各要素の値を変更、フィルタリング、または新たなリストを生成する操作を効率的に行えます。反復処理により、手動でインデックスを管理する必要がなく、安全かつ簡潔にリスト全体を扱うことが可能になります。
# リストの要素を処理
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 偶数のみ抽出
even_numbers = []
for num in numbers:
if num % 2 == 0:
even_numbers.append(num)
print(f"偶数: {even_numbers}") # [2, 4, 6, 8, 10]
# リスト内包表記(より簡潔な書き方)
even_numbers = [num for num in numbers if num % 2 == 0]
print(f"偶数(内包表記): {even_numbers}")
データの集計
データの集計はループと不可分です。ループ処理の中で変数を「蓄積器」として利用し、リストやデータシーケンスの要素を逐次加算したり、条件に合致する要素の個数をカウントしたりします。この反復的な累積計算により、合計値、平均値、最大値・最小値など、データセット全体の統計情報を求めることができます。
# テストの点数の統計
scores = [85, 92, 78, 90, 65, 88, 72, 95, 60, 83]
# 合計と平均の計算
total = 0
count = 0
for score in scores:
total += score
count += 1
average = total / count
print(f"点数合計: {total}")
print(f"平均点: {average:.2f}")
print(f"人数: {count}")
# 最高点と最低点
max_score = scores[0]
min_score = scores[0]
for score in scores:
if score > max_score:
max_score = score
if score < min_score:
min_score = score
print(f"最高点: {max_score}")
print(f"最低点: {min_score}")
ファイルの処理
ファイル処理では、ループを用いてファイル内容を効率的に読み書きします。特に、for文でファイルオブジェクトを直接イテレートすることで、メモリを節約しつつ行単位で内容を逐次処理できます。大量のデータを含むファイルでも、先頭から順に一行ずつ読み込み、必要な処理を施しながら出力するといった流れを実現します。
# ファイルの行を読み込んで処理
try:
with open("sample.txt", "r", encoding="utf-8") as file:
line_number = 1
for line in file:
line = line.strip() # 改行文字を除去
if line: # 空行でない場合
print(f"{line_number}: {line}")
line_number += 1
except FileNotFoundError:
print("ファイルが見つかりません")
無限ループとその回避
while文を使用する際は、無限ループに注意する必要があります。
ユーザーからの入力を繰り返し受け取り、入力内容に応じて処理を分岐します。"quit" が入力された場合に break でループを終了し、"hello" や "help" の場合はそれぞれ応答を返します。その他の入力にはエラーメッセージを表示し、再び入力待ちに戻ります。
# 安全な無限ループの例
while True:
user_input = input("コマンドを入力してください (quitで終了): ")
if user_input.lower() == "quit":
print("プログラムを終了します")
break
elif user_input.lower() == "hello":
print("Hello!")
elif user_input.lower() == "help":
print("利用可能なコマンド: hello, help, quit")
else:
print("不明なコマンドです。'help'でヘルプを表示します。")
ループのパフォーマンス考慮事項
効率的なループの書き方
1番目の例はインデックスを用いた非効率なアクセス方法で、二番目は直接要素にアクセスするPythonらしい簡潔な方法です。3番目のリスト内包表記は、より短く読みやすい記述で新しいリストを生成する現代的なアプローチであり、可読性と実行効率の両方を高める特徴を持っています。
# 非効率な例
numbers = [1, 2, 3, 4, 5]
for i in range(len(numbers)):
print(numbers[i])
# 効率的な例
for number in numbers:
print(number)
# さらに効率的(内包表記)
squared = [x**2 for x in numbers]
カウンターパターン
リスト内の偶数の要素数を数える典型的な処理を示しています。forループとif文を組み合わせて各要素を検査し、条件に合致する場合にカウンタ変数をインクリメントするという、基本的ながら汎用性の高い集計パターンを実装しています。ループと条件分岐による逐次処理の基本が理解できるシンプルで実用的な例です。
# 特定の条件を満たす要素の数を数える
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
count_even = 0
for num in numbers:
if num % 2 == 0:
count_even += 1
print(f"偶数の数: {count_even}")
アキュムレータパターン
リストの要素を順次加算して合計値を求める基本的な累積処理のパターンを表しています。ループの各反復で変数totalに現在の要素の値を加算することで、データを蓄積していく手法を示しています。この「蓄積器」パターンは、合計値の計算だけでなく、様々な集計処理に応用できるプログラミングの基礎的な概念です。
# 値を蓄積していく
numbers = [1, 2, 3, 4, 5]
total = 0
for num in numbers:
total += num
print(f"合計: {total}")
サーチパターン
リスト内から特定の要素を線形探索する典型的な手法を示しています。フラグ変数foundを初期化し、ループ内で条件一致時にフラグを立ててbreakで早期終了する効率的な処理が特徴です。目的の要素発見後は無駄な探索をせず、ループ終了後のフラグ状態で結果を出力する、実用的な検索アルゴリズムの基本形です。
# 特定の要素を探す
fruits = ["apple", "banana", "orange", "grape"]
target = "orange"
found = False
for fruit in fruits:
if fruit == target:
found = True
break
if found:
print(f"{target}が見つかりました")
else:
print(f"{target}は見つかりませんでした")
デバッグのコツ
ループ処理の内部状態を可視化する効果的なデバッグ手法を示しています。enumerate()でインデックスを取得し、各反復の開始時点での変数値と計算結果を詳細に出力することで、プログラムの実行フローとデータの変化を逐次確認できます。ループ中の不具合を特定する際に有用な、シンプルかつ実践的なデバッグの例です。
# ループのデバッグ
numbers = [1, 2, 3, 4, 5]
print("デバッグ開始")
for i, num in enumerate(numbers):
print(f"ループ {i}: num = {num}")
result = num * 2
print(f" 結果: {result}")
print("デバッグ終了")
for文が適している場合
- 反復回数が明確な場合
- コレクションのすべての要素を処理する場合
- 回数ベースの繰り返し
while文が適している場合
- 条件が満たされるまで繰り返す場合
- ユーザー入力の検証
- イベント駆動の処理
- 終了条件が複雑な場合
まとめ
この講義では、Pythonのループ処理(for文・while文)について学びました。for文によるシーケンスの反復処理や、range()関数を使った数値範囲のループ、条件に基づくwhile文の使い方を理解しました。また、break・continue・elseといったループ制御文や、ネストしたループによる多重処理も学びました。
リスト処理やデータ集計などの実践的な応用、安全な無限ループ設計、パフォーマンスを意識した効率的な記述方法、そしてデバッグによるトラブルシューティング手法についても習得しました。
ループ処理はプログラミングの基本的かつ強力な機能です。適切に使うことで、繰り返し作業を自動化し、効率的なプログラムを作成できます。
練習問題
初級問題(3問)
問題1
1から10までの数字をfor文を使って表示するプログラムを作成してください。
問題2
次のリストのすべての要素をwhile文を使って表示するプログラムを作成してください。
fruits = ["apple", "banana", "orange", "grape", "melon"]
問題3
1から100までの偶数のみを表示するプログラムを作成してください。(ヒント:剰余演算子%を使用)
中級問題(6問)
問題4
ユーザーから数値を入力させ、その数値の階乗を計算するプログラムを作成してください。
階乗とは、1からその数値までのすべての整数の積です(例:5! = 5×4×3×2×1 = 120)。
問題5
フィボナッチ数列の最初の20項を表示するプログラムを作成してください。
フィボナッチ数列は、各項が前2項の和になる数列です(1, 1, 2, 3, 5, 8, 13, …)。
問題6
次のリストから最大値と最小値を見つけて表示するプログラムを作成してください。
numbers = [34, 12, 89, 5, 67, 23, 91, 3, 78, 45]
問題7
素数判定プログラムを作成してください。ユーザーから数値を入力させ、その数値が素数かどうかを判定してください。素数とは1と自分自身以外で割り切れない数です(1は素数ではありません)。
問題8
九九の表を綺麗な形式で表示するプログラムを作成してください。
各数値は2桁で揃えて表示し、縦横の見出しも付けてください。
問題9
パスワード生成プログラムを作成してください。ユーザーからパスワードの長さを入力させ、ランダムな文字(大文字、小文字、数字)からなるパスワードを生成してください。
上級問題(3問)
問題10
数当てゲームを作成してください。プログラムが1から100の間の乱数を生成し、ユーザーがその数を当てるまで繰り返し入力を受け付けてください。ヒントとして「もっと大きい」または「もっと小さい」を表示してください。
問題11
与えられた数値のすべての約数を表示するプログラムを作成してください。また、その数値が完全数かどうかも判定してください。完全数とは、自分自身を除く約数の和が自分自身と等しくなる数です(例:6 = 1 + 2 + 3)。
問題12
マルチプルチョイスクイズプログラムを作成してください。複数の問題と選択肢、正解を用意し、ユーザーの回答を採点して最終的な得点を表示してください。問題は少なくとも5問以上用意してください。
初級問題 解答
問題1 解答
# 1から10までの数字を表示
for i in range(1, 11):
print(i)
別解(while文使用):
# while文で1から10まで表示
i = 1
while i <= 10:
print(i)
i += 1
実行結果:
1
2
3
4
5
6
7
8
9
10
問題2 解答
# while文でリストの要素を表示
fruits = ["apple", "banana", "orange", "grape", "melon"]
index = 0
while index < len(fruits):
print(fruits[index])
index += 1
実行結果:
apple
banana
orange
grape
melon
問題3 解答
# 1から100までの偶数を表示
for i in range(1, 101):
if i % 2 == 0:
print(i)
別解(rangeのステップ使用):
# 2から100まで2ずつ増加
for i in range(2, 101, 2):
print(i)
実行結果(一部):
2
4
6
8
10
...
98
100
中級問題 解答
問題4 解答
# 階乗計算プログラム
def factorial(n):
"""数値nの階乗を計算"""
result = 1
for i in range(1, n + 1):
result *= i
return result
# メインプログラム
try:
num = int(input("階乗を計算する数値を入力してください: "))
if num < 0:
print("負の数の階乗は定義されていません")
else:
result = factorial(num)
print(f"{num}! = {result}")
except ValueError:
print("数値を正しく入力してください")
実行例:
階乗を計算する数値を入力してください: 5
5! = 120
問題5 解答
# フィボナッチ数列を表示
def fibonacci(n):
"""フィボナッチ数列の最初のn項を生成"""
fib_sequence = []
a, b = 0, 1
for _ in range(n):
fib_sequence.append(b)
a, b = b, a + b
return fib_sequence
# 最初の20項を表示
n_terms = 20
fib_numbers = fibonacci(n_terms)
print(f"フィボナッチ数列の最初の{n_terms}項:")
for i, num in enumerate(fib_numbers, 1):
print(f"{i:2d}項: {num:>7}")
実行結果:
フィボナッチ数列の最初の20項: 1項: 1 2項: 1 3項: 2 4項: 3 5項: 5 6項: 8 7項: 13 ...
問題6 解答
# 最大値と最小値を見つける
numbers = [34, 12, 89, 5, 67, 23, 91, 3, 78, 45]
# 方法1: forループを使用
max_value = numbers[0]
min_value = numbers[0]
for num in numbers:
if num > max_value:
max_value = num
if num < min_value:
min_value = num
print(f"リスト: {numbers}")
print(f"最大値: {max_value}")
print(f"最小値: {min_value}")
# 方法2: 組み込み関数を使用(参考)
print(f"\n(参考)組み込み関数使用:")
print(f"最大値: {max(numbers)}")
print(f"最小値: {min(numbers)}")
実行結果:
リスト: [34, 12, 89, 5, 67, 23, 91, 3, 78, 45]
最大値: 91
最小値: 3
(参考)組み込み関数使用:
最大値: 91
最小値: 3
問題7 解答
# 素数判定プログラム
def is_prime(n):
"""数値nが素数かどうかを判定"""
if n <= 1:
return False
if n == 2:
return True
if n % 2 == 0:
return False
# 3から√nまでの奇数で割り切れるかチェック
for i in range(3, int(n**0.5) + 1, 2):
if n % i == 0:
return False
return True
# メインプログラム
try:
num = int(input("素数かどうか判定する数値を入力してください: "))
if is_prime(num):
print(f"{num} は素数です")
else:
print(f"{num} は素数ではありません")
# 追加: その数値までの素数を表示
print(f"\n{num}までの素数:")
primes = [i for i in range(2, num + 1) if is_prime(i)]
print(primes)
except ValueError:
print("数値を正しく入力してください")
実行例:
素数かどうか判定する数値を入力してください: 29
29 は素数です
29までの素数: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
問題8 解答
# 九九の表を綺麗に表示
print("九九の表")
print(" ", end="")
# 見出し行を表示
for i in range(1, 10):
print(f"{i:3d}", end="")
print()
# 区切り線を表示
print(" +" + "---" * 9)
# 九九の表本体
for i in range(1, 10):
print(f"{i} |", end="")
for j in range(1, 10):
print(f"{i*j:3d}", end="")
print()
実行結果:
九九の表
1 2 3 4 5 6 7 8 9
+---------------------------
1 | 1 2 3 4 5 6 7 8 9
2 | 2 4 6 8 10 12 14 16 18
3 | 3 6 9 12 15 18 21 24 27
...
問題9 解答
import random
import string
def generate_password(length):
"""指定された長さのランダムなパスワードを生成"""
# 使用する文字のプール
characters = string.ascii_letters + string.digits
password = ''
for _ in range(length):
password += random.choice(characters)
return password
# メインプログラム
try:
length = int(input("パスワードの長さを入力してください: "))
if length <= 0:
print("パスワードの長さは1以上で入力してください")
else:
password = generate_password(length)
print(f"生成されたパスワード: {password}")
# 複数のパスワードを生成するオプション
print("\n追加のパスワード:")
for i in range(3):
print(f"パスワード{i+1}: {generate_password(length)}")
except ValueError:
print("数値を正しく入力してください")
実行例:
パスワードの長さを入力してください: 12
生成されたパスワード: aB3xY8pQ2rT9
追加のパスワード:
パスワード1: kL7mN4vB1zX8
パスワード2: pR2sT5wY9zC0
パスワード3: dF6gH8jK2lM4
上級問題 解答
問題10 解答
import random
def number_guessing_game():
"""数当てゲーム"""
# 1から100の乱数を生成
secret_number = random.randint(1, 100)
attempts = 0
max_attempts = 10
print("=== 数当てゲーム ===")
print(f"1から100の間の数を当ててください({max_attempts}回まで挑戦できます)")
while attempts < max_attempts:
try:
guess = int(input(f"\n{attempts + 1}回目: あなたの予想は? "))
attempts += 1
if guess < secret_number:
print("もっと大きいです!")
elif guess > secret_number:
print("もっと小さいです!")
else:
print(f"正解! {secret_number} です!")
print(f"{attempts}回で当てました!")
break
except ValueError:
print("数値を正しく入力してください")
continue
else:
print(f"\nゲームオーバー!正解は {secret_number} でした")
# プレイアゲインのオプション
play_again = input("\nもう一度プレイしますか? (y/n): ").lower()
if play_again == 'y':
number_guessing_game()
# ゲーム開始
number_guessing_game()
実行例:
=== 数当てゲーム === 1から100の間の数を当ててください(10回まで挑戦できます)
1回目: あなたの予想は? 50 もっと大きいです!
2回目: あなたの予想は? 75 もっと小さいです!
3回目: あなたの予想は? 63
正解! 63 です! 3回で当てました!
問題11 解答
def find_divisors(n):
"""数値nのすべての約数を求める"""
divisors = []
for i in range(1, n + 1):
if n % i == 0:
divisors.append(i)
return divisors
def is_perfect_number(n):
"""数値nが完全数かどうかを判定"""
divisors = find_divisors(n)
# 自分自身を除く約数の和
divisor_sum = sum(divisors) - n
return divisor_sum == n
# メインプログラム
try:
num = int(input("数値を入力してください: "))
if num <= 0:
print("正の整数を入力してください")
else:
divisors = find_divisors(num)
print(f"{num}の約数: {divisors}")
print(f"約数の数: {len(divisors)}")
if is_perfect_number(num):
print(f"{num} は完全数です!")
print(f"約数の和(自分自身を除く): {sum(divisors) - num} = {num}")
else:
print(f"{num} は完全数ではありません")
print(f"約数の和(自分自身を除く): {sum(divisors) - num} ≠ {num}")
# 追加: その数値までの完全数を表示
print(f"\n{num}までの完全数:")
perfect_numbers = [i for i in range(2, num + 1) if is_perfect_number(i)]
if perfect_numbers:
for pn in perfect_numbers:
pn_divisors = find_divisors(pn)
print(f"{pn}: {pn_divisors} (和: {sum(pn_divisors) - pn})")
else:
print("完全数は見つかりませんでした")
except ValueError:
print("数値を正しく入力してください")
実行例:
数値を入力してください: 28
28の約数: [1, 2, 4, 7, 14, 28]
約数の数: 6 28 は完全数です!
約数の和(自分自身を除く): 28 = 28
28までの完全数: 6: [1, 2, 3, 6] (和: 6) 28: [1, 2, 4, 7, 14, 28] (和: 28)
問題12 解答
def quiz_game():
"""マルチプルチョイスクイズプログラム"""
# 問題データベース
questions = [
{
"question": "Pythonの創始者は誰ですか?",
"options": ["A. Guido van Rossum", "B. Bill Gates", "C. Steve Jobs", "D. Mark Zuckerberg"],
"answer": "A"
},
{
"question": "次のうち、Pythonのデータ型でないものはどれですか?",
"options": ["A. list", "B. tuple", "C. array", "D. dictionary"],
"answer": "C"
},
{
"question": "Pythonでリストの長さを取得する関数はどれですか?",
"options": ["A. size()", "B. length()", "C. len()", "D. count()"],
"answer": "C"
},
{
"question": "次のうち、ループを途中で終了するためのキーワードはどれですか?",
"options": ["A. stop", "B. exit", "C. break", "D. continue"],
"answer": "C"
},
{
"question": "Pythonのバージョンを確認するコマンドはどれですか?",
"options": ["A. python --version", "B. python -v", "C. python version", "D. python check"],
"answer": "A"
}
]
score = 0
total_questions = len(questions)
print("=== Pythonクイズ ===")
print(f"全{total_questions}問に答えてください\n")
# 各問題を順番に出題
for i, q in enumerate(questions, 1):
print(f"問題{i}: {q['question']}")
for option in q['options']:
print(f" {option}")
while True:
user_answer = input("\nあなたの答え (A/B/C/D): ").upper()
if user_answer in ['A', 'B', 'C', 'D']:
break
else:
print("A, B, C, Dのいずれかを入力してください")
if user_answer == q['answer']:
print("✅ 正解!")
score += 1
else:
print(f"❌ 不正解。正解は {q['answer']} です")
print("-" * 50)
# 結果表示
print("\n=== 結果 ===")
print(f"正解数: {score}/{total_questions}")
percentage = (score / total_questions) * 100
print(f"正答率: {percentage:.1f}%")
if percentage >= 80:
print("🎉 優秀です!")
elif percentage >= 60:
print("👍 良くできました!")
else:
print("💪 もう一度復習しましょう!")
# 再挑戦のオプション
retry = input("\nもう一度挑戦しますか? (y/n): ").lower()
if retry == 'y':
quiz_game()
# クイズ開始
quiz_game()
実行例:
=== Pythonクイズ ===
全5問に答えてください
問題1: Pythonの創始者は誰ですか?
A. Guido van Rossum
B. Bill Gates
C. Steve Jobs
D. Mark Zuckerberg
あなたの答え (A/B/C/D): A ✅
正解!
--------------------------------------------------
... === 結果 === 正解数: 4/5 正答率: 80.0% 🎉 優秀です!