【實作】用 Python 做學生成績管理程式

學生成績管理程式(Score Manager)

這篇 Python 實作教學是第二階段的總驗收:用 Dictionary + List 做一個文字選單的成績管理程式,支援新增成績、查詢學生、列出全班統計。會用到 dict 的增查、list 存放多筆成績、items() 走訪、List Comprehension 計算統計,再加上第一階段的 while 選單迴圈。

功能規格:

選項功能
1新增/更新學生成績
2查詢單一學生
3列出全班成績與平均
q離開程式

完整程式碼

建立 score_manager.py

scores = {}    # 結構:{"姓名": [成績1, 成績2, ...]}

print("=== 學生成績管理 ===")

while True:
    print("\n1.新增成績  2.查詢學生  3.全班統計  q.離開")
    choice = input("請選擇:").strip()

    if choice == "1":
        name = input("學生姓名:").strip()
        score = int(input("本次成績:"))
        if name not in scores:
            scores[name] = []          # 第一次出現,先建立空 List
        scores[name].append(score)
        print(f"已記錄 {name} 的成績 {score}")

    elif choice == "2":
        name = input("查詢姓名:").strip()
        if name in scores:
            s = scores[name]
            print(f"{name} 的成績:{s},平均 {sum(s) / len(s):.1f}")
        else:
            print(f"查無學生:{name}")

    elif choice == "3":
        if not scores:
            print("目前沒有任何資料")
            continue
        print(f"{'姓名':<6}{'次數':<6}{'平均':<8}")
        for name, s in scores.items():
            print(f"{name:<6}{len(s):<6}{sum(s) / len(s):<8.1f}")
        all_scores = [x for s in scores.values() for x in s]
        print(f"全班共 {len(all_scores)} 筆成績,總平均 {sum(all_scores) / len(all_scores):.1f}")

    elif choice == "q":
        print("再見")
        break

    else:
        print("無效的選項,請重新輸入")

執行範例:

=== 學生成績管理 ===

1.新增成績  2.查詢學生  3.全班統計  q.離開
請選擇:1
學生姓名:小明
本次成績:85
已記錄 小明 的成績 85

1.新增成績  2.查詢學生  3.全班統計  q.離開
請選擇:1
學生姓名:小華
本次成績:92
已記錄 小華 的成績 92

1.新增成績  2.查詢學生  3.全班統計  q.離開
請選擇:2
查詢姓名:小明
小明 的成績:[85],平均 85.0

1.新增成績  2.查詢學生  3.全班統計  q.離開
請選擇:3
姓名    次數    平均
小明    1     85.0
小華    1     92.0
全班共 2 筆成績,總平均 88.5

1.新增成績  2.查詢學生  3.全班統計  q.離開
請選擇:q
再見

程式逐段解說

1. 資料結構設計

scores = {}    # {"姓名": [成績1, 成績2, ...]}

核心決策:dict 的 key 是學生姓名(查詢快),value 是 List(一個學生可以有多筆成績)。「dict 包 list」是實務上最常見的組合之一。

2. 新增成績:先確認 key 存在

if name not in scores:
    scores[name] = []
scores[name].append(score)

第一次遇到的學生要先建立空 List,否則直接 append 會報 KeyError。這兩行也可以用 scores.setdefault(name, []).append(score) 一行完成。

3. 查詢與統計

print(f"{name} 的成績:{s},平均 {sum(s) / len(s):.1f}")

內建函式 sum() 加總、len() 計數,平均用 f-string 的 :.1f 取一位小數。全班統計用巢狀 Comprehension 把所有 List 攤平成一個:[x for s in scores.values() for x in s]

4. 表格對齊輸出

print(f"{name:<6}{len(s):<6}{sum(s) / len(s):<8.1f}")

f-string 的 :<6 表示靠左對齊、寬度 6,輸出整齊的文字表格(第 6 篇學的格式控制)。

挑戰練習

  1. 刪除功能:新增選項 4,用 del scores[name] 刪除學生(記得先檢查存在)
  2. 排名:統計時依平均分數由高到低排序(提示:sorted(scores.items(), key=...),第 22 篇 lambda 會教 key 的寫法)
  3. 防呆:成績輸入非數字會當掉,先用 .isdigit() 檢查,或等第 25 篇 try except

總結

這個程式把第二階段的重點全部串起來:dict 存主資料、list 存多筆成績、in 檢查 key、items() 走訪、Comprehension 攤平統計、f-string 對齊輸出。能自己加上挑戰練習的功能,資料結構就掌握得差不多了。下一階段進入函式——讓程式碼可以重複使用。

延伸閱讀