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 实现根据对象属性排序
结构设计思维 体现类封装、方法划分、模块职责分离等理念
相关推荐
Chris _data1 小时前
c#学习WPF笔记(一)
学习·c#·wpf
天天进步20151 小时前
Python全栈项目--基于机器学习的异常检测系统
开发语言·python·机器学习
AOwhisky8 小时前
Redis 学习笔记(第三期):持久化与主从复制
运维·数据库·redis·笔记·学习·云计算
xxie1237948 小时前
return与print
开发语言·python
秋98 小时前
从 Python 后端工程师转型 AI Engineer(AI 工程化)的完整补课清单(2026实战版)
开发语言·人工智能·python
程序员二叉9 小时前
【Java】 异常高频面试题精讲 | 易错点+对比总结
java·开发语言·面试
慕木沐9 小时前
Google ADK Java 1.0版本 核心机制与实战 Demo
java·开发语言·python
Tbisnic9 小时前
AI大模型学习第十一天:技术选型、安全防护与金融实战
python·学习·ai·大模型·提示词工程
Roann_seo%9 小时前
C++文件操作完全指南:从文本读写到二进制文件处理
开发语言·c++
hboot10 小时前
AI工程师第一课 - Python
前端·后端·python