完整代码(附有超详细注释):
import sys # 完整文
# 章,公z
# 号
# 数 道 无 穷
# 无 水 印
# 初始化数据结构
# students 是一个列表,用于存储所有学生的信息,每个学生是一个字典
students = []
# courses 是一个集合,表示系统中支持的课程名称
courses = {'math', 'python', 'english'}
def add_student():
"""添加学生信息(增强输入处理和异常捕获)"""
try:
print("\n--- 添加学生 ---")
# 获取用户输入的学生姓名,并去除首尾空格
name = input("请输入学生姓名: ").strip()
# 获取用户输入的学号,并去除首尾空格
student_id = input("请输入学号: ").strip()
# 检查学号是否唯一
for student in students:
if student['id'] == student_id:
print("学号已存在!")
return
# gzh: 数 道 无 穷
scores = {}
# 遍历所有课程,逐个输入成绩
for course in courses:
while True:
try:
# 输入成绩并转换为浮点数
score = float(input(f"请输入{course.capitalize()}成绩: ").strip())
# 检查成绩范围是否在0-100之间
if 0 <= score <= 100:
scores[course] = score
break
else:
print("成绩范围应在0-100之间")
except ValueError:
print("请输入有效数字")
# 将学生信息添加到students列表中
students.append({
'id': student_id,
'name': name,
'scores': scores
})
print(f"学生 {name}({student_id}) 添加成功!")
except Exception as e:
# 捕获并打印添加过程中可能发生的错误
print(f"添加过程中发生错误: {str(e)}")
# gzh: 数 道
# 无 穷
def show_students():
"""显示所有学生信息(优化格式化输出)"""
# 如果没有学生信息,提示用户
if not students:
print("暂无学生信息")
return
# 定义表头,使用字符串格式化对齐
header = f"{'学号':<12}{'姓名':<10}{'数学':<8}{'Python':<8}{'英语':<8}"
print("\n" + header)
print("-" * len(header))
# 遍历所有学生,格式化输出学生信息
for student in students:
scores = student['scores']
print(f"{student['id']:<12}{student['name']:<10}"
f"{scores.get('math', '-'):>8}" # 如果没有数学成绩,显示'-'
f"{scores.get('python', '-'):>8}" # 如果没有Python成绩,显示'-'
f"{scores.get('english', '-'):>8}") # 如果没有英语成绩,显示'-'
def query_student():
"""查询学生成绩(支持模糊查询)"""
print("\n--- 查询学生 ---")
# 获取用户输入的查询条件,并转为小写以便模糊匹配
query = input("请输入学号/姓名/部分姓名: ").strip().lower()
results = []
# 遍历所有学生,检查是否符合查询条件
for student in students:
if (query in student['id'].lower() or
query in student['name'].lower()):
results.append(student)
# 如果没有找到匹配结果,提示用户
if not results:
print("未找到相关信息!")
return
# 打印查询结果
print(f"\n找到 {len(results)} 个结果:")
for res in results:
print(f"\n学号: {res['id']}")
print(f"姓名: {res['name']}")
print("各科成绩:")
for course, score in res['scores'].items():
print(f" {course.capitalize()}:\t{score}")
avg = sum(res['scores'].values())/len(courses) # 计算平均分
print(f"平均分:\t{avg:.2f}")
def delete_student():
"""删除学生信息(增强确认机制)"""
print("\n--- 删除学生 ---")
# 获取用户输入的学号
student_id = input("请输入要删除的学号: ").strip()
global students
# 记录原始学生数量
original_count = len(students)
# 使用列表推导式过滤掉指定学号的学生
students = [s for s in students if s['id'] != student_id]
# 根据学生数量变化判断是否删除成功
if len(students) < original_count:
print(f"学号 {student_id} 删除成功!")
else:
print("未找到该学生!")
def calculate_average():
"""统计课程平均分(优化输出格式)"""
# 如果没有学生信息,提示用户
if not students:
print("没有学生数据!")
return
# 初始化课程总分字典
course_totals = {course: 0 for course in courses}
# 遍历所有学生,累加每门课程的成绩
for student in students:
for course in courses:
course_totals[course] += student['scores'].get(course, 0)
# 输出课程平均分
print("\n--- 课程平均分统计 ---")
for course, total in course_totals.items():
avg = total / len(students)
print(f"{course.capitalize()}:\t{avg:>8.2f}")
def sort_students():
"""成绩排序(添加排序方式选择)"""
# 如果没有学生信息,提示用户
if not students:
print("没有学生数据!")
return
# 提供排序方式选项
print("\n1. 按总分排序")
print("2. 按数学成绩排序")
print("3. 按Python成绩排序")
print("4. 按英语成绩排序")
choice = input("请选择排序方式: ").strip()
# 创建带总分的学生列表
ranked_students = []
for student in students:
total = sum(student['scores'].values())
ranked_students.append((
student['id'],
student['name'],
student['scores']['math'],
student['scores']['python'],
student['scores']['english'],
total
))
# gzh: 数 道 无 穷
# 根据用户选择的排序方式获取排序键
sort_key = {
'1': 5, # 总分
'2': 2, # 数学成绩
'3': 3, # Python成绩
'4': 4 # 英语成绩
}.get(choice, 5) # 默认按总分排序
# 对学生列表进行排序
ranked_students.sort(key=lambda x: x[sort_key], reverse=True)
# 输出排序结果
headers = ["排名", "学号", "姓名", "数学", "Python", "英语", "总分"]
print("\n" + "\t".join(headers))
for idx, stu in enumerate(ranked_students, 1):
print(f"{idx}\t{stu[0]}\t{stu[1]}\t{stu[2]}\t{stu[3]}\t{stu[4]}\t{stu[5]}")
def main_menu():
"""主菜单(增强错误处理)"""
while True:
try:
# 打印主菜单
print("\n" + "="*20 + " 学生成绩管理系统 " + "="*20)
print("1. 添加学生")
print("2. 显示所有学生")
print("3. 查询学生")
print("4. 统计平均分")
print("5. 删除学生")
print("6. 成绩排序")
print("0. 退出系统")
# 获取用户选择
choice = input("请选择操作: ").strip()
# 如果选择0,退出程序
if choice == '0':
sys.exit("感谢使用,再见!")
# 定义菜单选项对应的功能函数
menu_actions = {
'1': add_student,
'2': show_students,
'3': query_student,
'4': calculate_average,
'5': delete_student,
'6': sort_students
}
# 调用对应的功能函数
if choice in menu_actions:
menu_actions[choice]()
else:
print("无效的选择,请输入0-6之间的数字")
except KeyboardInterrupt:
# 捕获键盘中断,返回主菜单
print("\n操作已取消,返回主菜单...")
except Exception as e:
# 捕获并打印其他异常
print(f"系统发生错误: {str(e)}")
print("正在返回主菜单...")
if __name__ == "__main__":
# 程序入口,调用主菜单函数
main_menu()
"""
直接运行可能会出现无法输入的情况,
选择在终端运行可修复此问题
"""
整体结构设计
1.数据结构 :
students
:列表存储所有学生信息(每个学生是包含id
、name
、scores
的字典)courses
:集合存储支持的课程名称({'math', 'python', 'english'}
)
2.功能模块 :
- 添加学生:
add_student
- 显示学生:
show_students
- 查询学生:
query_student
- 统计平均分:
calculate_average
- 删除学生:
delete_student
- 成绩排序:
sort_students
3.主流程 :
主菜单循环main_menu
驱动程序运行
开发步骤详解
1. 添加学生
def add_student():
try:
# 输入学生信息
name = input("请输入学生姓名: ").strip()
student_id = input("请输入学号: ").strip()
# 检查学号唯一性
for student in students:
if student['id'] == student_id:
print("学号已存在!")
return
# 输入成绩并验证
scores = {}
for course in courses:
while True:
try:
score = float(input(f"请输入{course}成绩: "))
if 0 <= score <= 100:
scores[course] = score
break
else:
print("成绩应在0-100之间")
except ValueError:
print("请输入有效数字")
# 保存学生信息
students.append({
'id': student_id,
'name': name,
'scores': scores
})
except Exception as e:
print(f"添加失败: {e}")
- 输入验证 :去除输入的空格,确保学号唯一
- 成绩输入循环 :对每门课程重复输入直到有效
- 数据存储 :将学生信息以字典形式存入列表
2. 显示学生
def show_students():
if not students:
print("暂无学生信息")
return
# 格式化输出表头
header = f"{'学号':<12}{'姓名':<10}{'数学':<8}{'Python':<8}{'英语':<8}"
print(header)
print("-" * len(header))
# 遍历输出学生信息
for student in students:
scores = student['scores']
print(f"{student['id']:<12}{student['name']:<10}"
f"{scores.get('math', '-'):>8}"
f"{scores.get('python', '-'):>8}"
f"{scores.get('english', '-'):>8}")
- 格式化字符串 :使用
:<12
左对齐,:>8
右对齐 - 缺省值处理 :用
.get()
方法处理可能缺失的课程成绩
3. 查询学生
def query_student():
query = input("请输入学号/姓名: ").strip().lower()
results = []
# 模糊匹配学号或姓名
for student in students:
if (query in student['id'].lower() or
query in student['name'].lower()):
results.append(student)
# 输出详细信息
for res in results:
print(f"\n学号: {res['id']}")
print(f"姓名: {res['name']}")
print("各科成绩:")
for course, score in res['scores'].items():
print(f" {course}: {score}")
avg = sum(res['scores'].values())/len(courses)
print(f"平均分: {avg:.2f}")
- 模糊查询 :通过
in
操作符实现部分匹配 - 平均分计算 :遍历成绩字典求和取均值
4. 主菜单循环
def main_menu():
while True:
print("\n1. 添加学生\n2. 显示所有学生\n3. 查询学生\n4. 统计平均分\n5. 删除学生\n6. 成绩排序\n0. 退出")
choice = input("请选择操作: ").strip()
if choice == '0':
sys.exit("退出系统")
actions = {
'1': add_student,
'2': show_students,
'3': query_student,
'4': calculate_average,
'5': delete_student,
'6': sort_students
}
if choice in actions:
actions[choice]()
else:
print("无效选择!")
- 字典映射 :用
choice
键直接调用对应函数 - 无限循环 :通过
while True
保持程序运行 - 异常处理 :捕获
KeyboardInterrupt
防止程序意外退出
核心知识点
1.关键知识点
1.1. 数据结构
students
:列表存储字典,
courses
:集合存储课程名称
1.2. 输入验证
try-except
:捕获异常,检查学号唯一性,成绩范围验证
1.3. 字符串格式化
f-string
:格式化输出,
:<12
:对齐控制
1.4. 列表推导式
students = [s for s in students if s['id'] != student_id]
1.5. 函数字典映射
menu_actions = {'1': add_student, ...}
1.6. lambda表达式
sort(key=lambda x: x[sort_key])
2. 其它重要函数说明
input()
:获取用户输入float()
:转换输入为浮点数sys.exit()
:退出程序list.append()
:向列表追加元素list.sort()
:对列表进行排序dict.get()
:字典安全获取值,避免KeyError
3.注意事项
3.1. 输入处理
- 所有输入均使用
.strip()
去除首尾空格 - 在
add_student
中捕获ValueError
处理非数字输入 - 检查学号唯一性,确保数据不重复
3.2. 数据结构设计
- 用
courses
集合定义支持的课程,便于扩展 - 学生字典中嵌套
scores
字典实现多级数据存储
3.3. 函数设计
- 每个函数只完成一个功能(如
add_student
仅负责添加) students
和courses
作为全局变量被所有函数访问- 通过
return
提前终止函数执行(如学号重复时)
3.4. 界面交互
- 使用
print
的格式化提高可读性 - 通过数字作为选项,实现功能切换