【一个例子搞掂 | 简易学生成绩系统】Python语法基础(数据类型、数据结构、控制语句、函数)

完整代码(附有超详细注释):

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:列表存储所有学生信息(每个学生是包含idnamescores的字典)
  • 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仅负责添加)
  • studentscourses作为全局变量被所有函数访问
  • 通过return提前终止函数执行(如学号重复时)
3.4. 界面交互
  • 使用print的格式化提高可读性
  • 通过数字作为选项,实现功能切换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值