6个月Python学习计划 Day 18 - 项目实战 · 学生成绩管理系统(OOP版)

第三周 Day 5

🎯 今日目标

  • 运用类与对象封装学生数据与操作
  • 实现添加、查询、删除、排序等功能
  • 使用魔术方法美化输出

📦 项目需求描述

我们要构建一个简易的学生成绩管理系统,功能包括:

  1. 添加学生(姓名、学号、成绩)
  2. 查询所有学生
  3. 查找指定学号学生
  4. 删除学生
  5. 按成绩排序输出
  6. 退出系统

🧬 设计类结构

python 复制代码
class Student:
    def __init__(self, sid, name, score):
        self.sid = sid
        self.name = name
        self.score = score

    def __str__(self):
        return f"{self.sid:<6} {self.name:<10} {self.score:<5}"

class StudentManager:
    def __init__(self):
        self.students = []

    def add_student(self, sid, name, score):
        self.students.append(Student(sid, name, score))

    def show_all(self):
        print(f"{'学号':<6} {'姓名':<10} {'成绩':<5}")
        for stu in self.students:
            print(stu)

    def find_by_sid(self, sid):
        for stu in self.students:
            if stu.sid == sid:
                print("找到学生:", stu)
                return
        print("未找到该学号的学生。")

    def delete_by_sid(self, sid):
        for stu in self.students:
            if stu.sid == sid:
                self.students.remove(stu)
                print("删除成功!")
                return
        print("删除失败,未找到该学号。")

    def sort_by_score(self):
        self.students.sort(key=lambda x: x.score, reverse=True)
        print("成绩排序成功!")
        self.show_all()

🧪 主程序入口

python 复制代码
def run():
    manager = StudentManager()

    while True:
        print("\n==== 学生成绩管理系统 ====")
        print("1. 添加学生")
        print("2. 显示所有学生")
        print("3. 查找学生")
        print("4. 删除学生")
        print("5. 按成绩排序")
        print("6. 退出")
        choice = input("请输入操作编号:")

        if choice == "1":
            sid = input("请输入学号:")
            name = input("请输入姓名:")
            try:
                score = float(input("请输入成绩:"))
                manager.add_student(sid, name, score)
                print("添加成功!")
            except:
                print("成绩格式不正确!")
        elif choice == "2":
            manager.show_all()
        elif choice == "3":
            sid = input("请输入要查找的学号:")
            manager.find_by_sid(sid)
        elif choice == "4":
            sid = input("请输入要删除的学号:")
            manager.delete_by_sid(sid)
        elif choice == "5":
            manager.sort_by_score()
        elif choice == "6":
            print("感谢使用,已退出。")
            break
        else:
            print("输入无效,请重新输入。")

👉 最后在底部加一句:

python 复制代码
if __name__ == "__main__":
    run()

📝 今日练习任务

  1. 增加一个功能:根据姓名模糊搜索学生

    我们在 StudentManager 类中新增一个方法 search_by_name:

    python 复制代码
    def search_by_name(self, keyword):
        result = [stu for stu in self.students if keyword.lower() in stu.name.lower()]
        if result:
            print(f"{'学号':<6} {'姓名':<10} {'成绩':<5}")
            for stu in result:
                print(stu)
        else:
            print("未找到相关学生。")

    在主循环中添加对应的选项:

    python 复制代码
    elif choice == "7":
        keyword = input("请输入要查找的姓名关键词:")
        manager.search_by_name(keyword)

    别忘了在菜单中加入:

    python 复制代码
    print("7. 按姓名模糊查找")
  2. 为 Student 类增加一个 eq 方法,便于比较对象是否相同(学号相同即为同一人)

    我们在 Student 类中添加:

    python 复制代码
    def __eq__(self, other):
        if isinstance(other, Student):
            return self.sid == other.sid
        return False

    这个方法可以让我们用 == 比较两个 Student 对象是否代表同一位学生(通过学号)。


🧾 今日总结

技术点 应用说明
类与对象 将学生抽象为对象,提高代码清晰度和扩展性
魔术方法 str 优化输出格式
排序函数 + lambda 实现根据对象属性排序
结构设计思维 体现类封装、方法划分、模块职责分离等理念
相关推荐
Learner4 分钟前
Python异常处理
java·前端·python
superman超哥8 分钟前
Context与任务上下文传递:Rust异步编程的信息高速公路
开发语言·rust·编程语言·context与任务上下文传递·rust异步编程
步达硬件9 分钟前
【Matlab】批量自定义图像处理
开发语言·matlab
军军君0111 分钟前
Three.js基础功能学习七:加载器与管理器
开发语言·前端·javascript·学习·3d·threejs·三维
liulilittle13 分钟前
OPENPPP2 网络驱动模式
开发语言·网络·c++·网络协议·信息与通信·通信
mjhcsp16 分钟前
C++ AC 自动机:原理、实现与应用全解析
java·开发语言·c++·ac 自动机
huihuihuanhuan.xin17 分钟前
后端八股之java并发编程
java·开发语言
hui函数19 分钟前
Python系列Bug修复|如何解决 pip install 安装报错 Backend ‘setuptools.build_meta’ 不可用 问题
python·bug·pip
谢的2元王国19 分钟前
prompt工程逐渐成为工作流的重要一部分:以下是一套多节点新闻处理外加事实增强的文章报告日志记录
python