ここでは、「ループ+if+関数化」 で再利用しやすい構造にリファクタリングした
実践的な「成績判定アプリ(CSV保存付き)」を紹介します。
成績判定アプリ(関数化・ループ付き・CSV保存)
機能
- 名前と点数をユーザー入力
- 不正入力なら再入力を促す
- 成績を自動判定
- CSVに保存
- 関数で処理を分け、再利用可能な構造
コード例
import csv
FILENAME = "scores.csv"
# -------------------------------
# 成績を判定する関数
# -------------------------------
def judge_grade(score):
"""点数から成績(A〜D)を返す"""
if score >= 80:
return "A"
elif score >= 70:
return "B"
elif score >= 60:
return "C"
else:
return "D"
# -------------------------------
# 入力処理を行う関数
# -------------------------------
def get_valid_score():
"""0〜100の点数を正しく入力させる"""
while True:
score_str = input("点数(0〜100): ")
if score_str.isdigit():
score = int(score_str)
if 0 <= score <= 100:
return score
print("❌ 無効な入力です。0〜100の数値を入力してください。")
# -------------------------------
# CSVに保存する関数
# -------------------------------
def save_to_csv(name, score, grade):
"""結果をCSVファイルに追記"""
with open(FILENAME, mode="a", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow([name, score, grade])
# -------------------------------
# メイン処理
# -------------------------------
def main():
print("=== 成績判定アプリ ===")
print("名前と点数を入力してください('終了'で終了)")
# 初回のみヘッダー行を書き込む
with open(FILENAME, mode="a", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
if f.tell() == 0: # ファイルが空なら
writer.writerow(["名前", "点数", "成績"])
while True:
name = input("名前: ")
if name == "終了":
print("入力を終了します。")
break
score = get_valid_score() # バリデーション付き入力
grade = judge_grade(score) # 成績判定
print(f"{name}さんの成績は「{grade}」です。\n")
save_to_csv(name, score, grade) # 結果を保存
print(f"✅ 全ての結果を {FILENAME} に保存しました。")
# -------------------------------
# スクリプト実行部分
# -------------------------------
if __name__ == "__main__":
main()
Python
関数化のポイント
| 関数名 | 役割 | 再利用の例 |
|---|
judge_grade(score) | 成績判定 | 他のアプリでも同じロジックを使える(例:テスト管理ツール) |
get_valid_score() | 入力+チェック | 複数科目の入力などにも使える |
save_to_csv(name, score, grade) | 保存処理 | ログ保存・顧客管理などにも応用可能 |
main() | 全体の流れをまとめる | メニュー制御などを追加して拡張できる |
実行例
=== 成績判定アプリ ===
名前と点数を入力してください('終了'で終了)
名前: 田中
点数(0〜100): 85
田中さんの成績は「A」です。
名前: 鈴木
点数(0〜100): 72
鈴木さんの成績は「B」です。
名前: 終了
入力を終了します。
✅ 全ての結果を scores.csv に保存しました。
出力CSV内容
発展課題(おすすめ)
- 複数科目対応版(国語・数学・英語をまとめて判定)
- 平均点・最高点の自動表示
- PySimpleGUI版(ウィンドウ入力+結果一覧)
- pandasで集計して分析グラフを出す