學生成績管理程式(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 篇學的格式控制)。
挑戰練習
- 刪除功能:新增選項 4,用
del scores[name]刪除學生(記得先檢查存在) - 排名:統計時依平均分數由高到低排序(提示:
sorted(scores.items(), key=...),第 22 篇 lambda 會教 key 的寫法) - 防呆:成績輸入非數字會當掉,先用
.isdigit()檢查,或等第 25 篇 try except
總結
這個程式把第二階段的重點全部串起來:dict 存主資料、list 存多筆成績、in 檢查 key、items() 走訪、Comprehension 攤平統計、f-string 對齊輸出。能自己加上挑戰練習的功能,資料結構就掌握得差不多了。下一階段進入函式——讓程式碼可以重複使用。
延伸閱讀
- Python 教學(系列目錄)
- Python List 串列
- Python Dictionary 字典
- Python List Comprehension
- 【實作】用 Python 寫終極密碼猜數字遊戲
- Python 函式 (def)(下一篇)