本文将以星炬一部学生管理系统为例,完整拆解Python实现学生管理系统的全流程,覆盖全部源代码+架构设计+技术亮点,适合Python初学者学习“系统级项目开发思维”与“工程化编码规范”。

一、系统概览

  1. 业务场景

为学生管理部门提供数字化工具,实现学生信息增删改查、成绩统计、随机抽答等,提升管理效率。

  1. 核心功能清单

数据持久化:通过JSON文件实现数据存储与加载,支持中文兼容与格式化输出,确保数据不丢失。

信息维护:提供添加、查询、删除、修改学生信息功能,覆盖学生数据全生命周期操作。

成绩管理:支持按Python/职场/总成绩排序(升序/降序),统计星炬一部学生人数。

特色功能:随机抽答系统(随机算法等概率选人),满足课堂互动需求。

交互体验:菜单导航+输入验证+格式化输出,提升用户操作友好度。
二、系统架构
(1). 三层架构

表现层:负责用户交互,包括菜单显示(print_menu())、输入验证(get_valid_input())、结果格式化输出(show_students())。

业务层:实现核心功能逻辑,如学生增删改查(add_student()/delete_student()等)、成绩排序(sort_students())、随机抽答(random_question_student())。

数据层:处理数据持久化,通过load_data()加载JSON文件数据,save_data()将数据写入JSON文件。

(2). 工业级设计亮点

配置中心化:常量(如FILENAME存储文件名、DEPARTMENT限定管理部门)集中定义,修改业务规则无需改动逻辑代码。

异常安全:文件IO、JSON解析、用户输入均加try-except捕获异常(如文件损坏自动重置、输入非法值循环提示),防止程序崩溃。

单一职责:每个函数仅实现一个功能,提升可维护性。

高内聚复用:通用逻辑封装为独立函数(get_valid_input()),在添加、修改、查询等多处复用。

(3).学生管理系统能执行的核心功能

  1. 添加学生信息

输入7位唯一ID、姓名、Python/职场成绩(0-100分),自动计算总分;

从预设列表选择职位(如学员、技术主管)、管理老师(如雷老板、丹姐);

输入初始奖项(逗号分隔,无则留空);

数据实时保存到star_torch_students.json。

  1. 查询学生信息

支持按ID或按姓名精确查询;

仅显示“星炬一部”的学生,结果格式化输出。

  1. 删除学生信息

按7位ID定位学生,显示详情后二次确认;

确认后删除并保存数据,避免误操作。

  1. 修改学生信息

按7位ID定位学生,显示当前信息;

可选择修改姓名、Python/职场成绩、职位、奖项(增/删/清空)、管理老师;

修改后自动更新总分并保存。

  1. 成绩排序

按Python成绩、职场成绩、总成绩之一排序;

支持升序/降序选择;

排序后保存并显示结果。

  1. 统计学生人数

统计“星炬一部”当前学生总数并打印。

  1. 显示所有学生

格式化输出“星炬一部”所有学生的ID、姓名、部门、职位、成绩、奖项、管理老师。

  1. 随机抽答(单抽)

从“星炬一部”学生中纯随机等概率抽取1人;

显示被选中者的姓名、职位、成绩、奖项、管理老师。

  1. 退出系统

退出前自动保存所有数据,提示“再见”。

(4).各个段代码的作用

1.定义系统核心配置与常量
在这里插入图片描述
5. 从JSON文件加载学生数据
在这里插入图片描述
6. 将学生数据保存到JSON文件
在这里插入图片描述
7. 打印系统主菜单
在这里插入图片描述
8. 通用输入验证函数
在这里插入图片描述
9. 添加学生(输入基础信息与成绩)
在这里插入图片描述
10. 选择学生职位
在这里插入图片描述
11. 输入学生奖项
在这里插入图片描述
12. 选择管理老师
在这里插入图片描述
13. 保存新学生数据并判断是否继续添加
在这里插入图片描述
14. 按学号或姓名查询学生信息
在这里插入图片描述
15. 按学号删除学生信息(需二次确认)
在这里插入图片描述
16. 按学号查找学生并选择修改项
在这里插入图片描述
17. 处理学生职位、奖项、老师等具体信息的修改
在这里插入图片描述
18. 对学生奖项进行添加、删除或清空操作
在这里插入图片描述
19. 按指定成绩字段对学生进行升序或降序排序
在这里插入图片描述
20. 统计特定部门的学生总人数
在这里插入图片描述
21. 显示特定部门的所有学生
在这里插入图片描述
22. 以表格形式格式化显示学生列表
在这里插入图片描述
23. 格式化单个学生的详细信息用于展示
在这里插入图片描述
21.随机抽答主函数:筛选部门学生并提供抽答模式菜单
在这里插入图片描述
22.单次随机抽取:等概率抽取一名学生并展示其详细信息
在这里插入图片描述
23.程序主函数:系统主循环,根据用户输入调用不同功能模块
在这里插入图片描述
24.程序入口:标准Python程序启动代码,调用主函数开始执行。
在这里插入图片描述

(5)、使用的软件:Pycharm

(6)、总函数

import json
import os
import random

FILENAME = “star_torch_students.json” # 数据存储文件(JSON格式)
DEPARTMENT = “星炬一部” # 仅管理的部门
SUBJECTS = [“Python”, “职场”] # 考试科目
TEACHER = [“雷老板”, “丹姐”, “黄念”, “张炼”, “柯灵”] # 管理老师列表(原MANAGERS改为TEACHER)
POSITIONS = [“学员”, “技术主管”, “项目经理”, “行政主管”, “组长”, “财务主管”,
“人事主管”, “新媒体负责人”, “新媒体学员”, “文化大使”] # 可选职位列表
RANDOM_MODES = [“1.抽1人回答(随机)”, “0.返回主菜单”] # 抽答模式

---------------------- 数据持久化(独立实现) ----------------------

def load_data():
“”“加载星炬一部学生数据(JSON格式)
逻辑:文件存在则读取,否则返回空列表;文件损坏重置为空列表”“”
try:
if os.path.exists(FILENAME):
with open(FILENAME, “r”, encoding=“utf-8”) as f:
return json.load(f) # 返回学生字典列表
return [] # 首次运行返回空列表
except json.JSONDecodeError:
print(“数据文件损坏,已重置为空列表”)
return []

def save_data(data):
“”“保存学生数据到JSON文件(支持中文存储)”“”
try:
with open(FILENAME, “w”, encoding=“utf-8”) as f:
json.dump(data, f, ensure_ascii=False, indent=4) # 格式化存储
except Exception as e:
print(f"保存失败:{str(e)}")

---------------------- 菜单与输入处理 ----------------------

def print_menu():
“”“显示系统菜单”“”
print(“\n” + “=” * 40)
print(f"星炬一部学生管理系统(仅管理{DEPARTMENT})“)
print(”=" * 40)
print(“1. 添加学生信息”)
print(“2. 查询学生信息”)
print(“3. 删除学生信息”)
print(“4. 修改学生信息”)
print(“5. 成绩排序”)
print(“6. 统计学生人数”)
print(“7. 显示所有学生”)
print(“8. 随机抽答(单抽)”)
print(“0. 退出系统”)
print(“=” * 40)

def get_valid_input(prompt: str, input_type: type, validator=None):
“”“通用输入验证函数(循环验证直到输入有效)
prompt: 输入提示;input_type: 期望类型(int/str);validator: 自定义验证函数”“”
while True:
try:
value = input_type(input(prompt).strip())
if validator and not validator(value):
raise ValueError(“输入不符合要求”)
return value
except ValueError as e:
print(f"输入错误:{e},请重试!")

---------------------- 核心功能函数(优化逻辑) ----------------------

def add_student(students):
“”“添加学生(含职位、奖项、老师选择)
逻辑:循环输入直到用户停止,验证ID唯一性、成绩范围”“”
existing_ids = [s[“id”] for s in students] # 现有ID列表(防重复)
while True:
try:

1. 输入基础信息(验证7位ID)

student_id_str = get_valid_input(
“请输入学生ID(7位数字,如2023001):”,
str,
lambda x: len(x) == 7 and x.isdigit() and int(x) not in existing_ids
)
student_id = int(student_id_str) # 转换为整数存储
name = get_valid_input(“请输入姓名:”, str, lambda x: len(x) > 0)
python_score = get_valid_input(f"请输入{SUBJECTS[0]}成绩(0-100):“, int, lambda x: 0 <= x <= 100)
workplace_score = get_valid_input(f"请输入{SUBJECTS[1]}成绩(0-100):”, int, lambda x: 0 <= x <= 100)
total_score = python_score + workplace_score

#2. 选择职位(序号对应文字)

print(f"\n职位选项(输入序号1-{len(POSITIONS)}):“)
for i, pos in enumerate(POSITIONS, 1):
print(f” {i}. {pos}")
position_idx = get_valid_input(“职位序号:”, int, lambda x: 1 <= x <= len(POSITIONS)) - 1
position = POSITIONS[position_idx]

#3. 输入奖项(逗号分隔)

awards_input = input(“请输入初始奖项(如无则直接回车):”).strip()
awards = awards_input.split(“,”) if awards_input else []

#4. 选择管理老师(序号对应文字)

print(f"\n管理老师选项(输入序号1-{len(TEACHER)}):“)
for i, t in enumerate(TEACHER, 1):
print(f” {i}. {t}")
teacher_idx = get_valid_input(“老师序号:”, int, lambda x: 1 <= x <= len(TEACHER)) - 1
manager = TEACHER[teacher_idx]

#5. 保存数据

new_student = {
“id”: student_id, “name”: name, “department”: DEPARTMENT,
“python”: python_score, “workplace”: workplace_score, “total_score”: total_score,
“position”: position, “awards”: awards, “manager”: manager
}
students.append(new_student)
save_data(students)
print(f"\n成功添加学生:{name}(ID:{student_id},{DEPARTMENT})")

#继续添加判断

if input(“\n是否继续添加(y/n)?”).lower() != “y”:
break
except Exception as e:
print(f"添加失败:{str(e)},请重试!")
return students

def search_student(students):
“”“查询学生(按ID/姓名)
逻辑:用列表推导式过滤结果,显示匹配学生”“”
if not students:
print(“暂无该学生数据!”)
return
while True:
mode = get_valid_input(“\n查询方式:1.按ID 2.按姓名 → “, int, lambda x: x in [1, 2])
keyword = input(“请输入关键词:”).strip()
results = [
s for s in students
if s[“department”] == DEPARTMENT and (str(s[“id”]) == keyword if mode == 1 else s[“name”] == keyword)
]
show_students(results) # 显示查询结果
if input(”\n是否继续查询(y/n)?”).lower() != “y”:
break

def delete_student(students):
“”“删除学生(按ID,二次确认)
逻辑:循环查找目标学生,确认后删除”“”
if not students:
print(“暂无学生数据!”)
return students
student_id_str = get_valid_input(“请输入要删除的学生ID(7位):”, str, lambda x: len(x) == 7 and x.isdigit())
student_id = int(student_id_str)
for i, s in enumerate(students):
if s[“department”] == DEPARTMENT and s[“id”] == student_id:
print(f"\n当前学生信息:\n{format_student(s)}")
if input(“确认删除(y/n)?”).lower() == “y”:
del students[i]
save_data(students)
print(“删除成功!”)
return students
print(“未找到该学生(仅支持星炬一部)!”)
return students

def modify_student(students):
“”“修改学生信息(含职位、奖项、老师)
逻辑:按ID查找目标学生,逐项修改”“”
if not students:
print(“暂无学生数据!”)
return students
student_id_str = get_valid_input(“请输入要修改的学生ID(7位):”, str, lambda x: len(x) == 7 and x.isdigit())
student_id = int(student_id_str)
for s in students:
if s[“department”] == DEPARTMENT and s[“id”] == student_id:
print(f"\n当前信息:\n{format_student(s)}“)
print(”\n请选择修改项(输入序号,0取消):")
print(“1. 姓名 2. Python成绩 3. 职场成绩 4. 职位 5. 奖项 6. 管理老师”)
mod_choice = get_valid_input(“修改项:”, int, lambda x: 0 <= x <= 6)
if mod_choice == 0:
print(“取消修改”)
return students

逐项修改

if mod_choice == 1:
s[“name”] = get_valid_input(f"新姓名(原:{s[‘name’]}):“, str, lambda x: len(x) > 0)
elif mod_choice == 2:
s[“python”] = get_valid_input(f"新{SUBJECTS[0]}成绩(0-100,原:{s[‘python’]}):”, int, lambda x: 0 <= x <= 100)
elif mod_choice == 3:
s[“workplace”] = get_valid_input(f"新{SUBJECTS[1]}成绩(0-100,原:{s[‘workplace’]}):“, int, lambda x: 0 <= x <= 100)
elif mod_choice == 4:
print(f"职位选项:{‘, ‘.join(f’{i}.{p}’ for i, p in enumerate(POSITIONS, 1))}”)
pos_idx = get_valid_input(“新职位序号:”, int, lambda x: 1 <= x <= len(POSITIONS)) - 1
s[“position”] = POSITIONS[pos_idx]
elif mod_choice == 5:
modify_awards(s) # 调用奖项修改子函数
elif mod_choice == 6:
print(f"管理老师选项:{‘, ‘.join(f’{i}.{t}’ for i, t in enumerate(TEACHER, 1))}")
teacher_idx = get_valid_input(“新老师序号:”, int, lambda x: 1 <= x <= len(TEACHER)) - 1
s[“manager”] = TEACHER[teacher_idx]

更新总成绩

s[“total_score”] = s[“python”] + s[“workplace”]
save_data(students)
print(“修改成功!”)
return students
print(“未找到该学生(仅支持星炬一部)!”)
return students

def modify_awards(student):
“”“修改奖项(增/删/清空)
逻辑:用列表操作实现奖项管理”“”
print(f"\n当前奖项:{', '.join(student[‘awards’]) if student[‘awards’] else ‘无’}“)
print(“奖项操作:1.添加 2.删除 3.清空 0.取消”)
award_choice = get_valid_input(“操作:”, int, lambda x: 0 <= x <= 3)
if award_choice == 0:
return
elif award_choice == 1:
new_award = input(“请输入新奖项:”).strip()
if new_award:
student[“awards”].append(new_award)
print(f"已添加奖项:{new_award}”)
elif award_choice == 2:
if not student[“awards”]:
print(“无奖项可删!”)
return
print(“奖项列表:”, “, “.join(f”{i+1}.{a}” for i, a in enumerate(student[“awards”])))
del_idx = get_valid_input(“请输入删除序号:”, int, lambda x: 1 <= x <= len(student[“awards”])) - 1
removed = student[“awards”].pop(del_idx)
print(f"已删除奖项:{removed}")
elif award_choice == 3:
student[“awards”] = []
print(“奖项已清空!”)

def sort_students(students):
“”“成绩排序(按Python/职场/总成绩,升序/降序)
逻辑:用lambda表达式排序,保存结果”“”
if not students:
print(“暂无学生数据!”)
return
print(f"\n排序字段:1.{SUBJECTS[0]} 2.{SUBJECTS[1]} 3.总成绩")
field_idx = get_valid_input(“字段序号(1-3):”, int, lambda x: 1 <= x <= 3) - 1
fields = [SUBJECTS[0].lower(), SUBJECTS[1].lower(), “total_score”]
sort_field = fields[field_idx]
order = get_valid_input(“升降序:0.升序 1.降序 → “, int, lambda x: x in [0, 1])
reverse = (order == 1)
students.sort(key=lambda x: x[sort_field], reverse=reverse)
save_data(students)
print(f”\n已按{‘降序’ if reverse else ‘升序’}排序(按{sort_field})”)
show_all_students(students) # 显示排序结果

def count_students(students):
“”“统计星炬一部学生人数
逻辑:用列表推导式过滤部门,计算长度”“”
count = len([s for s in students if s[“department”] == DEPARTMENT])
print(f"\n星炬一部当前学生总数:{count}人")

def show_all_students(students):
“”“显示所有星炬一部学生(调用show_students)”“”
star_torch_students = [s for s in students if s[“department”] == DEPARTMENT]
show_students(star_torch_students)

def show_students(students):
“”“格式化显示学生列表”“”
if not students:
print(“无数据显示!”)
return
print(“\nID 姓名 部门 职位 Python 职场 总分 奖项 管理老师”)
for s in students:
awards_str = “, “.join(s[“awards”]) if s[“awards”] else “无”
print(f”{s[‘id’]} {s[‘name’]} {s[‘department’]} {s[‘position’]} {s[‘python’]} {s[‘workplace’]} {s[‘total_score’]} {awards_str} {s[‘manager’]}”)

def format_student(student):
“”“格式化单个学生信息(用于详情展示)”“”
awards_str = “, “.join(student[“awards”]) if student[“awards”] else “无”
return f””“ID:{student[‘id’]} | 姓名:{student[‘name’]}
部门:{student[‘department’]} | 职位:{student[‘position’]}
Python:{student[‘python’]} | 职场:{student[‘workplace’]} | 总成绩:{student[‘total_score’]}
奖项:{awards_str} | 管理老师:{student[‘manager’]}”“”

---------------------- 随机抽答模块 ----------------------

def random_question_student(students):
“”“纯随机抽答主函数
逻辑:用random.choice实现等概率抽1人”“”
star_torch_students = [s for s in students if s[“department”] == DEPARTMENT]
if not star_torch_students:
print(“星炬一部暂无学生,无法抽答!”)
return

while True:
print(f"\n纯随机抽答系统(当前共{len(star_torch_students)}人)“)
for mode in RANDOM_MODES:
print(mode)
choice = get_valid_input(”\n请选择抽答模式(0-1):", int, lambda x: 0 <= x <= 1)
if choice == 0:
print(“返回主菜单”)
break
elif choice == 1:
single_draw(star_torch_students) # 抽1人

def single_draw(students):
“”“抽1人(纯随机,等概率)”“”
selected = random.choice(students)
print(f"\n恭喜被选中回答问题的同学:“)
print(f"姓名:{selected[‘name’]} | 职位:{selected[‘position’]}”)
print(f"成绩:Python({selected[‘python’]}) + 职场({selected[‘workplace’]}) = {selected[‘total_score’]}“)
print(f"奖项:{', '.join(selected[‘awards’]) if selected[‘awards’] else ‘暂无’}”)
print(f"管理老师:{selected[‘manager’]}")

---------------------- 主程序(循环处理用户选择) ----------------------

def main():
“”“主程序入口(循环处理用户选择)”“”
students = load_data() # 初始化加载数据
while True:
print_menu() # 显示菜单
try:
choice = get_valid_input(“\n请选择操作(0-8):”, int, lambda x: 0 <= x <= 8)
if choice == 0:
save_data(students) # 退出前保存数据
print(“感谢使用星炬一部管理系统,再见!”)
break
elif choice == 1:
students = add_student(students)
elif choice == 2:
search_student(students)
elif choice == 3:
students = delete_student(students)
elif choice == 4:
students = modify_student(students)
elif choice == 5:
sort_students(students)
elif choice == 6:
count_students(students)
elif choice == 7:
show_all_students(students)
elif choice == 8:
random_question_student(students) # 进入抽答模块
else:
print(“输入错误,请选择0-8!”)
except Exception as e:
print(f"错误:{str(e)}")

---------------------- 运行入口 ----------------------

if name == “main”:
main()

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐