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 实现根据对象属性排序
结构设计思维 体现类封装、方法划分、模块职责分离等理念
相关推荐
测试老哥2 小时前
Postman参数化详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·postman
头疼的程序员4 小时前
MySQL学习之触发器
学习·mysql
ThreeYear_s5 小时前
基于FPGA的PID算法学习———实现PI比例控制算法
学习·算法·fpga开发
CodeCraft Studio6 小时前
Excel处理控件Aspose.Cells教程:使用 C# 从 Excel 进行邮件合并
开发语言·c#·excel
小超爱编程6 小时前
纯前端做图片压缩
开发语言·前端·javascript
银色的白7 小时前
工作记录:人物对话功能开发与集成
vue.js·学习·前端框架
亚林瓜子8 小时前
AWS中国云的定时任务(AWS EventBridge+AWS Lambda)
python·云计算·aws·lambda·定时任务·event·cron
新中地GIS开发老师8 小时前
三维GIS开发cesium智慧地铁教程(4)城市白模加载与样式控制
学习·arcgis·智慧城市·webgl·gis开发·webgis·地理信息科学
摆渡搜不到你8 小时前
某腾X视频下载器2.1
python·音视频
科雷软件测试8 小时前
Python格式化:让数据输出更优雅
python