【Python】学生管理系统 📅 发布时间:2026/7/16 2:48:48 👁️ 浏览次数: 文章目录1. 需求说明2. 创建入口函数3. 实现菜单函数4. 实现增删查改操作4.1 新增学生4.2 显示学生4.3 查找学生4.4 删除学生4.5 修改学生5. 加入存档读档5.1 约定存档格式5.2 实现存档函数5.3 实现读档函数6. 完整代码实现7. 打包成 exe 程序发布7.1 安装 pyinstaller7.2. 打包程序1. 需求说明实现一个命令行版本的学生管理系统支持学生信息的增、删、查、改以及本地文件持久化存储。主要功能新增学生输入学号、姓名、性别、班级自动查重。显示学生列表化整齐展示所有学生信息。查找学生根据姓名搜索匹配的学生记录。删除学生根据学号精准删除学生记录。修改学生根据学号定位并更新学生信息。存档读档程序启动自动读档数据变动自动存档。2. 创建入口函数设计要点初始化全局列表students。程序启动时立即调用load()函数加载本地数据。循环调用menu()并根据返回值执行对应功能模块。代码如下importsysimportos# 存储所有学生信息的全局列表students[]defmain(): 程序的入口函数 # 1. 启动时加载存档load()print(---------------------------)print(| 欢迎使用学生管理系统! |)print(---------------------------)whileTrue:choicemenu()ifchoice0:print(退出程序欢迎下次使用!)sys.exit()elifchoice1:insert()elifchoice2:show()elifchoice3:find()elifchoice4:delete()elifchoice5:update()else:print(您的输入有误! 请重新输入!)if__name____main__:main()3. 实现菜单函数增加了对非数字输入的处理防止程序因int()转换失败而崩溃。代码如下defmenu(): 显示程序菜单并获取用户输入 print(\n-*30)print( 1. 新增学生信息)print( 2. 显示所有同学信息)print( 3. 根据名字查找学生信息)print( 4. 删除学生信息)print( 5. 修改学生信息)print( 0. 退出程序)print(-*30)choiceinput( 请输入您的选择: ).strip()ifnotchoice.isdigit():return-1returnint(choice)4. 实现增删查改操作4.1 新增学生增加了学号重复检查避免逻辑冲突。代码如下definsert():print([新增学生] 开始!)studentIdinput(请输入学生的学号: ).strip()# 检查学号是否重复forsinstudents:ifs[studentId]studentId:print(学号已存在! 新增失败!)returnnameinput(请输入学生的姓名: )genderinput(请输入学生的性别 (男/女): )ifgendernotin(男,女):print(性别不符合要求! 新增失败!)returnclassNameinput(请输入学生的班级: )student{studentId:studentId,name:name,gender:gender,className:className}students.append(student)save()print([新增学生] 完毕!)4.2 显示学生使用格式化字符串保证列对齐。代码如下defshow():print(f[显示学生] 共有{len(students)}条记录)# 使用格式化对齐print(f{学号:10}\t{姓名:10}\t{性别:5}\t{班级:10})forsinstudents:print(f{s[studentId]:10}\t{s[name]:10}\t{s[gender]:5}\t{s[className]:10})4.3 查找学生代码如下deffind():nameinput(请输入要查找的同学姓名: )count0forsinstudents:ifnames[name]:print(f找到记录: [{s[studentId]}]\t{s[name]}\t{s[gender]}\t{s[className]})count1print(f[查找完成] 共找到{count}条记录!)4.4 删除学生采用列表推导式删除避免遍历时直接删除导致的索引问题。代码如下defdelete():globalstudents studentIdinput(请输入要删除的同学学号: )original_lenlen(students)# 重新构建列表过滤掉目标学号students[sforsinstudentsifs[studentId]!studentId]iflen(students)original_len:save()print(f学号为{studentId}的同学信息已删除!)else:print(未找到该学号的学生!)4.5 修改学生代码如下defupdate():studentIdinput(请输入要修改的同学学号: )forsinstudents:ifs[studentId]studentId:print(f找到学生 [{s[name]}]请输入新信息 (回车表示不修改该项))new_nameinput(f姓名 ({s[name]}): ).strip()ifnew_name:s[name]new_name new_genderinput(f性别 ({s[gender]}): ).strip()ifnew_genderin(男,女):s[gender]new_gender new_classinput(f班级 ({s[className]}): ).strip()ifnew_class:s[className]new_class save()print(修改成功!)returnprint(未找到该学号的学生!)5. 加入存档读档5.1 约定存档格式存档文件约定保存在当前目录下的record.txt。编码方式UTF-8。分隔方式每行一个学生信息字段间使用\t分隔。5.2 实现存档函数代码如下defsave(): 将全局列表 students 写入文件 try:withopen(record.txt,w,encodingutf-8)asf:forsinstudents:f.write(f{s[studentId]}\t{s[name]}\t{s[gender]}\t{s[className]}\n)exceptExceptionase:print(f存档失败:{e})5.3 实现读档函数代码如下defload(): 从文件加载数据到全局列表 students ifnotos.path.exists(record.txt):returnglobalstudents students[]try:withopen(record.txt,r,encodingutf-8)asf:forlineinf:lineline.strip()ifnotline:continuetokensline.split(\t)iflen(tokens)4:student{studentId:tokens[0],name:tokens[1],gender:tokens[2],className:tokens[3]}students.append(student)print(f[读档成功] 已加载{len(students)}条历史记录!)exceptExceptionase:print(f读档失败:{e})6. 完整代码实现代码如下importsysimportos# # 2.1 全局配置与入口# students[]# 存储学生信息的全局列表defmain(): 程序的入口函数初始化并控制主循环 load()# 启动时先读档print(---------------------------)print(| 欢迎使用学生管理系统! |)print(---------------------------)whileTrue:choicemenu()ifchoice0:print(感谢使用再见!)sys.exit()elifchoice1:insert()elifchoice2:show()elifchoice3:find()elifchoice4:delete()elifchoice5:update()else:print(您的输入有误! 请重新输入!)# # 3. 菜单功能# defmenu(): 显示菜单并捕获用户输入 print(\n*30)print( 1. 新增学生信息)print( 2. 显示所有同学信息)print( 3. 根据名字查找学生信息)print( 4. 删除学生信息)print( 5. 修改学生信息)print( 0. 退出程序)print(*30)choiceinput( 请输入您的选择: ).strip()ifnotchoice.isdigit():return-1returnint(choice)# # 4. 核心业务逻辑# definsert():新增学生print(\n[新增学生] 开始)sidinput(请输入学号: ).strip()forsinstudents:ifs[studentId]sid:print(错误该学号已存在)returnnameinput(请输入姓名: ).strip()genderinput(请输入性别 (男/女): ).strip()ifgendernotin(男,女):print(错误性别不符合要求)returnclassNameinput(请输入班级: ).strip()students.append({studentId:sid,name:name,gender:gender,className:className})save()print([新增学生] 完毕!)defshow():显示所有学生ifnotstudents:print(\n[提示] 目前没有学生记录。)returnprint(f\n[显示学生] 共{len(students)}条记录)print(f{学号:10}\t{姓名:10}\t{性别:5}\t{班级:10})forsinstudents:print(f{s[studentId]:10}\t{s[name]:10}\t{s[gender]:5}\t{s[className]:10})deffind():查找学生nameinput(\n请输入要查找的姓名: ).strip()foundFalseforsinstudents:ifnames[name]:print(f找到记录: [{s[studentId]}]{s[name]}|{s[gender]}|{s[className]})foundTrueifnotfound:print(f未找到名为 [{name}] 的学生。)defdelete():删除学生globalstudents sidinput(\n请输入要删除的学号: ).strip()original_lenlen(students)students[sforsinstudentsifs[studentId]!sid]iflen(students)original_len:save()print(f学号为 [{sid}] 的学生已成功删除。)else:print(未找到该学号操作取消。)defupdate():修改学生 (新增逻辑)sidinput(\n请输入要修改的学生学号: ).strip()forsinstudents:ifs[studentId]sid:print(f已找到 [{s[name]}]请输入新信息 (回车跳过不修改):)new_nameinput(f新姓名 ({s[name]}): ).strip()ifnew_name:s[name]new_name new_genderinput(f新性别 ({s[gender]}): ).strip()ifnew_genderin(男,女):s[gender]new_gender new_classinput(f新班级 ({s[className]}): ).strip()ifnew_class:s[className]new_class save()print(信息更新成功!)returnprint(未找到该学号的学生。)# # 5. 持久化存储 (存档读档)# defsave():将数据写入本地 record.txttry:withopen(record.txt,w,encodingutf-8)asf:forsinstudents:f.write(f{s[studentId]}\t{s[name]}\t{s[gender]}\t{s[className]}\n)exceptExceptionase:print(f存储出错:{e})defload():从本地 record.txt 读取数据ifnotos.path.exists(record.txt):returnglobalstudents students[]try:withopen(record.txt,r,encodingutf-8)asf:forlineinf:lineline.strip()ifnotline:continuetokensline.split(\t)iflen(tokens)4:students.append({studentId:tokens[0],name:tokens[1],gender:tokens[2],className:tokens[3]})print(f[读档成功] 加载了{len(students)}条记录)exceptExceptionase:print(f读档出错:{e})if__name____main__:main()7. 打包成 exe 程序发布当前虽然已经实现了一个管理系统但是.py的文件只能在安装了 Python 环境的机器上运行。为了能够更好的部署到其他主机上可以借助pyinstaller来把 Python 程序打包成 exe 程序。7.1 安装 pyinstaller在终端执行pipinstallpyinstaller由于官方源在国外国内访问有时会断断续续。你可以通过-i参数切换到清华大学或阿里云的镜像源速度会快很多。pip install pyinstaller-i https://pypi.tuna.tsinghua.edu.cn/simple运行结果如下7.2. 打包程序其中-F表示打包成单个 exe不带动态库在终端输入pyinstaller -F test.py注意如果提示找不到pyinstaller命令则需要重启一下 PyCharm。稍等片刻很快打包完成。此时就可以把这个程序拷贝给其他机器使用了无需 Python 环境即可运行。如下所示
华源证券 Android 开发工程师面试题库 华源证券股份有限公司 android安卓开发工程师 职位信息 岗位职责: 1. 负责证券类 Android 客户端应用的功能开发与长期维护,覆盖行情、交易、账户、资讯等核心模块 2. 参与客户端 整体架构设计,持续优化应用的 稳定性与安全性,满足金融级应用要求 3. 深度优化应用启动速度、… 2026/7/15 19:34:08
云南大学计算机考研复试【经验分享】 云南大学计算机复试的一些建议 云南大学计算机相关专业复试采用线下现场复试,综合成绩由初试成绩占60%、复试成绩占40%构成,复试在总成绩中占比高,对最终录取结果影响显著。 以信息学院为例,复试成绩计算方式为:英语… 2026/7/11 12:00:06
西南石油大学计算机考研复试【经验分享】 给2026年西南石油大学计算机复试的一些建议 西南石油大学计算机相关专业复试分为机试、外国语测试、面试和思想政治素质与品德考核四部分,全程录音录像。 其中: 1)机试:采用PTA平台,编程语言为C语言,满分… 2026/5/17 5:29:22
化学信息学 | SMARTS模式匹配实战指南 1. SMARTS模式匹配入门指南如果你曾经用过正则表达式来搜索文本,那么SMARTS可以理解为化学分子领域的"正则表达式"。它是一种强大的描述语言,专门用于匹配分子结构和化学模式。我第一次接触SMARTS是在研究药物分子筛选项目时,当时需… 2026/7/16 2:47:23
Claude Code开发工具链:从CLI到VS Code集成的系统实践指南 1. 项目概述:这不是一份“教程”,而是一张Claude Code能力地图你搜“Claude Code”时,页面上跳出来的全是零散的截图、几行命令、某个插件的安装步骤,或者干脆是报错信息——“‘claude’不是可识别的命令”、“Virtual Machine P… 2026/7/16 2:45:23
自然语言处理编码器核心原理与应用实践详解 自然语言处理中的编码器是理解文本语义的核心组件,今天我们来深入解析编码器的基本概念和工作原理。无论你是刚接触Transformer架构的新手,还是希望巩固基础知识的开发者,这篇文章将通过图解和实例帮你建立清晰的认知框架。编码器在自然语言处… 2026/7/16 2:45:23
错题本只整理错误知识点,编写程序,基于错题反向设计全新解题思路,哪怕思路效率更低,也优先收录创新解法。 用 Python 构建一个“错题反向创新解法收录器”: 不只要“订正错题”,更要基于错题“反向设计”全新的解题思路——哪怕更慢、更绕,只要视角不同,就优先收录。 内容紧扣心理健康与创新能力课程,保持去营销化、中立、可… 2026/7/16 2:43:22
一文拆解小型直流有刷电机的核心部件与工作原理 1. 小型直流有刷电机的基本组成第一次拆开小型直流有刷电机时,你会发现它就像一个精密的机械玩具。这种电机主要由四个核心部件构成:定子永磁铁、转子线圈、换向器和电刷。每个部件都扮演着不可或缺的角色,共同完成电能到机械能的转换。定子永… 2026/7/16 2:43:22
移动端传感器交互开发:摇一摇与拧一摇技术实现详解 最近在开发社区里,一个看似简单的需求却让不少开发者头疼:如何让用户通过一个直观、有趣的动作来触发应用内的特定功能?传统的按钮点击、下拉刷新已经难以满足用户对交互体验的更高期待。而今天要介绍的"魔方摇一摇"和"好茶拧… 2026/7/16 2:41:22
A--10 Codex Review与GitHub PR工作流实战指南:从代码审查到安全合并 摘要:本文系统讲解如何利用Codex App的Review功能与GitHub PR工作流,实现从代码修改到安全合并的完整流程。涵盖Review面板深度使用、/review命令实战、GitHub Connector配置、PR描述撰写技巧,以及常见问题排查方法。通过多个实战案例和流程图,帮助开发者建立高效的AI辅助代… 2026/7/16 0:00:26
HAM未来路线图:下一代高可用迁移技术的发展方向与展望 HAM未来路线图:下一代高可用迁移技术的发展方向与展望 【免费下载链接】ham Based on the remote memory access capability and high bandwidth of the UB, deterministic duration virtual machine live migration is achieved, addressing planned downtime issu… 2026/7/16 0:04:27
月球是否是从地球分离出去的?——容度原理解释 月球是否是从地球分离出去的?——容度原理解释一、月球起源的“三大假说”与容度原理的重新审视月球起源的三大假说——捕获说(月球是太阳系中独立的星体,被地球引力捕获)、共生说(月球与地球同时从原始星云中形成&… 2026/7/16 0:06:27
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/14 18:25:04
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/14 5:09:41