第三周 Day 5
🎯 今日目标
- 运用类与对象封装学生数据与操作
- 实现添加、查询、删除、排序等功能
- 使用魔术方法美化输出
📦 项目需求描述
我们要构建一个简易的学生成绩管理系统,功能包括:
- 添加学生(姓名、学号、成绩)
- 查询所有学生
- 查找指定学号学生
- 删除学生
- 按成绩排序输出
- 退出系统
🧬 设计类结构
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()
📝 今日练习任务
-
增加一个功能:根据姓名模糊搜索学生
我们在 StudentManager 类中新增一个方法 search_by_name:
pythondef 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("未找到相关学生。")
在主循环中添加对应的选项:
pythonelif choice == "7": keyword = input("请输入要查找的姓名关键词:") manager.search_by_name(keyword)
别忘了在菜单中加入:
pythonprint("7. 按姓名模糊查找")
-
为 Student 类增加一个 eq 方法,便于比较对象是否相同(学号相同即为同一人)
我们在 Student 类中添加:
pythondef __eq__(self, other): if isinstance(other, Student): return self.sid == other.sid return False
这个方法可以让我们用 == 比较两个 Student 对象是否代表同一位学生(通过学号)。
🧾 今日总结
技术点 | 应用说明 |
---|---|
类与对象 | 将学生抽象为对象,提高代码清晰度和扩展性 |
魔术方法 str | 优化输出格式 |
排序函数 + lambda | 实现根据对象属性排序 |
结构设计思维 | 体现类封装、方法划分、模块职责分离等理念 |