
一、题目# 添加学生学号名字年龄分数 # 查看当前已录入的学生 # 修改、删除学生信息 # 根据成绩排序本文增加了其他功能 # 退出系统二、全部代码def add_stu(): print(添加学生信息) name input(请输入学生名字) age int(input(请输入学生的年龄)) score int(input(请输入学生的分数)) global cur_id cur_id 1 student.append({学号:cur_id,姓名:name,年龄:age,分数:score}) print(f学生{name}添加成功~) def get_stu(): if not len(student): print(当前没有学生信息) return else: while True: choice input(请输入查询的方式按学号查询、按姓名查询、按年龄查询、按分数查询、退出查询) if choice 按学号查询: id_now int(input(请输入学生的学号)) find_flag False for stu in student: if stu[学号] id_now: print(f学号{stu[学号]},姓名:{stu[姓名]},年龄:{stu[年龄]},分数:{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 按姓名查询: name_now input(请输入学生的姓名) find_flag False for stu in student: if stu[姓名] name_now: print(f学号{stu[学号]},姓名:{stu[姓名]},年龄:{stu[年龄]},分数:{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 按年龄查询: age_now int(input(请输入学生的年龄)) find_flag False for stu in student: if stu[年龄] age_now: print(f学号{stu[学号]}姓名{stu[姓名]}年龄{stu[年龄]}分数{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 按分数查询: score_now int(input(请输入学生的分数)) find_flag False for stu in student: if stu[分数] score_now: print(f学号{stu[学号]},姓名{stu[姓名]},年龄{stu[年龄]},分数{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 退出查询: break else: print(输入错误请重新输入(按学号查询、按姓名查询、按年龄查询、按分数查询)) def change_stu(): if not len(student): print(当前没有学生信息无法修改请输入学生信息后修改) return else: while True: choice input(请输入修改的方式按学号修改、按姓名修改、按年龄修改、按分数修改、退出修改) if choice 按学号修改: id_now int(input(请输入要修改的学生学号)) id_change int(input(请输入修改后的学号)) find_flag False for stu in student: if stu[学号] id_now: stu[学号] id_change print(f学号{stu[学号]},姓名:{stu[姓名]},年龄:{stu[年龄]},分数:{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 按姓名修改: name_now input(请输入要修改的学生姓名) name_change input(请输入修改后的姓名) find_flag False for stu in student: if stu[姓名] name_now: stu[姓名] name_change print(f学号{stu[学号]},姓名:{stu[姓名]},年龄:{stu[年龄]},分数:{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 按年龄修改: age_now int(input(请输入要修改学生年龄)) age_change int(input(请输入修改后的年龄)) find_flag False for stu in student: if stu[年龄] age_now: stu[年龄] age_change print(f学号{stu[学号]}姓名{stu[姓名]}年龄{stu[年龄]}分数{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 按分数修改: score_now int(input(请输入要修改的学生分数)) score_change int(input(请输入修改后的分数)) find_flag False for stu in student: if stu[分数] score_now: stu[分数] score_change print(f学号{stu[学号]},姓名{stu[姓名]},年龄{stu[年龄]},分数{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 退出修改: break else: print(输入错误请重新输入(按学号修改、按姓名修改、按年龄修改、按分数修改、退出修改)) def del_stu(): if not len(student): print(当前没有学生信息无法删除请输入学生信息后删除) return else: while True: choice input(请输入删除的方式按学号删除、按姓名删除、按年龄删除、按分数删除、退出删除) if choice 按学号删除: id_now int(input(请输入要删除的学生学号)) find_flag False for stu in student[:]: if stu[学号] id_now: student.remove(stu) print(删除成功~) find_flag True if not find_flag: print(没有找到该学生) elif choice 按姓名删除: name_now input(请输入要删除的学生姓名) find_flag False for stu in student[:]: if stu[姓名] name_now: student.remove(stu) print(删除成功~) find_flag True if not find_flag: print(没有找到该学生) elif choice 按年龄删除: age_now int(input(请输入要删除学生年龄)) find_flag False for stu in student[:]: if stu[年龄] age_now: student.remove(stu) print(删除成功~) find_flag True if not find_flag: print(没有找到该学生) elif choice 按分数删除: score_now int(input(请输入要删除的学生分数)) find_flag False for stu in student[:]: if stu[分数] score_now: student.remove(stu) print(删除成功~) find_flag True if not find_flag: print(没有找到该学生) elif choice 退出删除: break else: print(输入错误请重新输入(按学号删除、按姓名删除、按年龄删除、按分数删除、退出删除)) def test(item): print(item) return item def show_stu(): for i in student: print(f学号{i[学号]},姓名:{i[姓名]},年龄:{i[年龄]},分数:{i[分数]}) def sort_stu(): if not len(student): print(当前没有学生信息无法排列请输入学生信息后排列) return else: while True: choice input(请输入排列的方式按学号排列、按年龄排列、按分数排列、退出排列) if choice 按学号排列: while True: choice1 input(请输入按学号排列的方式从小到大、从大到小) if choice1 从大到小: student.sort(keylambda item: item[学号], reverseTrue) show_stu() break elif choice1 从小到大: student.sort(keylambda item: item[学号], reverseFalse) show_stu() break else: print(输入错误请重新输入(从大到小、从小到大)) break elif choice 按年龄排列: while True: choice2 input(请输入按年龄排列的方式从小到大、从大到小) if choice2 从大到小: student.sort(keylambda item: item[年龄], reverseTrue) show_stu() break elif choice2 从小到大: student.sort(keylambda item: item[年龄], reverseFalse) show_stu() break else: print(输入错误请重新输入(从大到小、从小到大)) break elif choice 按分数排列: while True: choice3 input(请输入按分数排列的方式从小到大、从大到小) if choice3 从大到小: student.sort(keylambda item: item[分数], reverseTrue) show_stu() break elif choice3 从小到大: student.sort(keylambda item: item[分数], reverseFalse) show_stu() break else: print(输入错误请重新输入(从大到小、从小到大)) break elif choice 退出排列: break else: print(输入错误请重新输入(按学号排列、按年龄排列、按分数排列、退出排列)) student [] cur_id 0 while True: print(1)添加学生信息) print(2)查看学生信息) print(3)修改学生信息) print(4)删除学生信息) print(5)排序学生信息) print(6)退出系统) num input(请选择功能菜单前的序号) if num 1: add_stu() elif num 2: get_stu() elif num 3: change_stu() elif num 4: del_stu() elif num 5: sort_stu() elif num 6: print(退出成功~) exit() else: print(输入错误请重新输入【1~6】之间的数字)三、代码分析一、添加学生信息def add_stu(): print(添加学生信息) name input(请输入学生名字) age int(input(请输入学生的年龄)) score int(input(请输入学生的分数)) global cur_id cur_id 1 student.append({学号:cur_id,姓名:name,年龄:age,分数:score}) print(f学生{name}添加成功~)student [] cur_id 0定义一个add_stu函数调用这个函数就会执行函数内的代码在控制台打印请输入学生名字提醒用户输入用input()接收用户在键盘输入的内容分别保存到变量name、age、score里其中agea和score强制类型转换从字符串变成了整形方便后续查找在函数add_stu外部定义了一个变量cur_id 1累加用作学号用global声明cur_id是全局变量使cur_id累加后的结果在全局能起作用创建一个空列表student [ ]之后会在列表student里面嵌套字典用来存放所有学生的字典数据student.app()列表方法往列表末尾追加一条数据。print()打印成功提示二、查询学生信息def get_stu(): if not len(student): print(当前没有学生信息) return else: while True: choice input(请输入查询的方式按学号查询、按姓名查询、按年龄查询、按分数查询、退出查询) if choice 按学号查询: id_now int(input(请输入学生的学号)) find_flag False for stu in student: if stu[学号] id_now: print(f学号{stu[学号]},姓名:{stu[姓名]},年龄:{stu[年龄]},分数:{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 按姓名查询: name_now input(请输入学生的姓名) find_flag False for stu in student: if stu[姓名] name_now: print(f学号{stu[学号]},姓名:{stu[姓名]},年龄:{stu[年龄]},分数:{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 按年龄查询: age_now int(input(请输入学生的年龄)) find_flag False for stu in student: if stu[年龄] age_now: print(f学号{stu[学号]}姓名{stu[姓名]}年龄{stu[年龄]}分数{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 按分数查询: score_now int(input(请输入学生的分数)) find_flag False for stu in student: if stu[分数] score_now: print(f学号{stu[学号]},姓名{stu[姓名]},年龄{stu[年龄]},分数{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 退出查询: break else: print(输入错误请重新输入(按学号查询、按姓名查询、按年龄查询、按分数查询))定义一个get_stu函数调用这个函数就会执行函数内的代码主框架用if-else语句来判断student这个链表是否为空表if部分通过len()来判断student链表的长度若链表中无数据则not len(student)为真执行if内的语句print输出语句提示用户无法查询并return结束当前函数elif部分通过while True重复循环完成多次查询的功能。设置变量choice接收用户输入的字符串。用一个if四个elif一个else构成框架判断choice用户输入的查询要求。若choice等于 按学号查询 则用户需要再次输入 想要查询的学号 并将输入的字符串学号强制类型转换为整型以便下面查找是类型一致。设置布尔型变量find_flag用来作为判断标志。用for循环历遍student链表查找学号找到学号则打印出该学号学生的所有信息并将find_flag改为True。之后出for循环用if语句结合find_flag判断是否找到该学生按姓名查询、按年龄查询、按分数查询和 按学号查询 类似就不作过多解释了若choice等于 退出查询 则break跳出while循环else部分若choice都不等于这五种查询选项则提示输入错误并提示用户再次输入三、修改学生信息def change_stu(): if not len(student): print(当前没有学生信息无法修改请输入学生信息后修改) return else: while True: choice input(请输入修改的方式按学号修改、按姓名修改、按年龄修改、按分数修改、退出修改) if choice 按学号修改: id_now int(input(请输入要修改的学生学号)) id_change int(input(请输入修改后的学号)) find_flag False for stu in student: if stu[学号] id_now: stu[学号] id_change print(f学号{stu[学号]},姓名:{stu[姓名]},年龄:{stu[年龄]},分数:{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 按姓名修改: name_now input(请输入要修改的学生姓名) name_change input(请输入修改后的姓名) find_flag False for stu in student: if stu[姓名] name_now: stu[姓名] name_change print(f学号{stu[学号]},姓名:{stu[姓名]},年龄:{stu[年龄]},分数:{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 按年龄修改: age_now int(input(请输入要修改学生年龄)) age_change int(input(请输入修改后的年龄)) find_flag False for stu in student: if stu[年龄] age_now: stu[年龄] age_change print(f学号{stu[学号]}姓名{stu[姓名]}年龄{stu[年龄]}分数{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 按分数修改: score_now int(input(请输入要修改的学生分数)) score_change int(input(请输入修改后的分数)) find_flag False for stu in student: if stu[分数] score_now: stu[分数] score_change print(f学号{stu[学号]},姓名{stu[姓名]},年龄{stu[年龄]},分数{stu[分数]}) find_flag True if not find_flag: print(没有找到该学生) elif choice 退出修改: break else: print(输入错误请重新输入(按学号修改、按姓名修改、按年龄修改、按分数修改、退出修改))定义一个change_stu函数调用这个函数就会执行函数内的代码主框架用if-else语句来判断student这个链表是否为空表if部分通过len()来判断student链表的长度若链表中无数据则not len(student)为真执行if内的语句print输出语句提示用户无法修改并return结束当前函数elif部分通过while True重复循环完成多次修改的功能。设置变量choice接收用户输入的字符串。用一个if三个elif一个else构成框架判断choice用户输入的修改要求。若choice等于 按学号修改 则用户需要再次输入 想要修改的学号 并输入 想要修改成为的学号 注意这两个输入的学号都要强制类型转化为整型方便之后查询修改。设置布尔型变量find_flag用来作为判断标志。用for循环历遍student链表查找想要修改的学号找到学号将修改后的学号赋值到链表对应的位置并打印出该学号学生的所有信息。并将find_flag改为True。之后出for循环用if语句结合find_flag判断是否找到该学生按姓名修改、按年龄修改、按分数修改和 按学号修改 类似就不作过多解释了若choice等于 退出修改 则break跳出while循环else部分若choice都不等于这五种修改选项则提示输入错误并提示用户再次输入四、删除学生信息def del_stu(): if not len(student): print(当前没有学生信息无法删除请输入学生信息后删除) return else: while True: choice input(请输入删除的方式按学号删除、按姓名删除、按年龄删除、按分数删除、退出删除) if choice 按学号删除: id_now int(input(请输入要删除的学生学号)) find_flag False for stu in student[:]: if stu[学号] id_now: student.remove(stu) print(删除成功~) find_flag True if not find_flag: print(没有找到该学生) elif choice 按姓名删除: name_now input(请输入要删除的学生姓名) find_flag False for stu in student[:]: if stu[姓名] name_now: student.remove(stu) print(删除成功~) find_flag True if not find_flag: print(没有找到该学生) elif choice 按年龄删除: age_now int(input(请输入要删除学生年龄)) find_flag False for stu in student[:]: if stu[年龄] age_now: student.remove(stu) print(删除成功~) find_flag True if not find_flag: print(没有找到该学生) elif choice 按分数删除: score_now int(input(请输入要删除的学生分数)) find_flag False for stu in student[:]: if stu[分数] score_now: student.remove(stu) print(删除成功~) find_flag True if not find_flag: print(没有找到该学生) elif choice 退出删除: break else: print(输入错误请重新输入(按学号删除、按姓名删除、按年龄删除、按分数删除、退出删除))定义一个del_stu函数调用这个函数就会执行函数内的代码主框架用if-else语句来判断student这个链表是否为空表if部分通过len()来判断student链表的长度若链表中无数据则not len(student)为真执行if内的语句print输出语句提示用户无法删除并return结束当前函数elif部分通过while True重复循环完成多次删除的功能。设置变量choice接收用户输入的字符串。用一个if四个elif一个else构成框架判断choice用户输入的查询要求。若choice等于 按学号删除 则用户需要再次输入 想要删除的学号 并将输入的字符串学号强制类型转换为整型以便下面查找是类型一致。设置布尔型变量find_flag用来作为判断标志。用for循环历遍student链表注意用到了student[:]是列表切片写法。冒号左边不写默认从第 0 个元素开始冒号右边不写默认一直取到列表最后一个元素。在本文最后会详细解释用这个而不用student的原因查找学号找到学号则删除该学号学生的所有信息并将find_flag改为True。之后出for循环用if语句结合find_flag判断是否找到该学生按姓名删除、按年龄删除、按分数删除和 按学号删除 类似就不作过多解释了若choice等于 退出删除 则break跳出while循环else部分若choice都不等于这五种删除选项则提示输入错误并提示用户再次输入五、排序def test(item): print(item) return item def show_stu(): for i in student: print(f学号{i[学号]},姓名:{i[姓名]},年龄:{i[年龄]},分数:{i[分数]})讲排序函数之前先介绍一下这两个函数这两个函数使排序函数更简洁test(item)这个函数就是一个简单的 “接收数据→打印→原路返回”之后方便在排序后直接打印show_stu函数历遍链表student后打印全部数据。后续排序函数需要多次打印为了节省空间所有设置了函数调用def sort_stu(): if not len(student): print(当前没有学生信息无法排列请输入学生信息后排列) return else: while True: choice input(请输入排列的方式按学号排列、按年龄排列、按分数排列、退出排列) if choice 按学号排列: while True: choice1 input(请输入按学号排列的方式从小到大、从大到小) if choice1 从大到小: student.sort(keylambda item: item[学号], reverseTrue) show_stu() break elif choice1 从小到大: student.sort(keylambda item: item[学号], reverseFalse) show_stu() break else: print(输入错误请重新输入(从大到小、从小到大)) break elif choice 按年龄排列: while True: choice2 input(请输入按年龄排列的方式从小到大、从大到小) if choice2 从大到小: student.sort(keylambda item: item[年龄], reverseTrue) show_stu() break elif choice2 从小到大: student.sort(keylambda item: item[年龄], reverseFalse) show_stu() break else: print(输入错误请重新输入(从大到小、从小到大)) break elif choice 按分数排列: while True: choice3 input(请输入按分数排列的方式从小到大、从大到小) if choice3 从大到小: student.sort(keylambda item: item[分数], reverseTrue) show_stu() break elif choice3 从小到大: student.sort(keylambda item: item[分数], reverseFalse) show_stu() break else: print(输入错误请重新输入(从大到小、从小到大)) break elif choice 退出排列: break else: print(输入错误请重新输入(按学号排列、按年龄排列、按分数排列、退出排列))定义一个sort_stu函数调用这个函数就会执行函数内的代码主框架用if-else语句来判断student这个链表是否为空表if部分通过len()来判断student链表的长度若链表中无数据则not len(student)为真执行if内的语句print输出语句提示用户无法排序并return结束当前函数elif部分通过while True重复循环完成多次排序的功能。设置变量choice接收用户输入的字符串。用一个if三个elif一个else构成框架判断choice用户输入的排序要求。若choice等于 按学号排序 则用户需要再次输入 想要学号大小排序的方式 用一个if和两个elif语句判断学号排序的方式。若choice1为 从大到小 则执行下面语句。其中student.sort()原地排序直接修改原始 student 列表。keylambda item:item[学号]匿名函数取每个学生字典对应字段作为排序依据。之后调用show_stu()函数 打印排列好的student链表。通过break,退出当前内循环。从小到大 类似。若输入都不是则提示用户重新输入。按年龄排序、按分数排序 和 按学号排序 类似就不作过多解释了若choice等于 退出排序 则break跳出while循环else部分若choice都不等于这四种删除选项则提示输入错误并提示用户再次输入六、菜单while True: print(1)添加学生信息) print(2)查看学生信息) print(3)修改学生信息) print(4)删除学生信息) print(5)排序学生信息) print(6)退出系统) num input(请选择功能菜单前的序号) if num 1: add_stu() elif num 2: get_stu() elif num 3: change_stu() elif num 4: del_stu() elif num 5: sort_stu() elif num 6: print(退出成功~) exit() else: print(输入错误请重新输入【1~6】之间的数字)通过while True可以循环打印菜单并输入功能选项用变量num接收用户输入的序号if-elif-else语句判断功能键在个功能键内调用对应的函数其中功能键6的exit()会退出整个程序。若用户输入的数字不在范围内则else提醒用户重新输入四、思路分析def add_stu(): pass def get_stu(): pass def change_stu(): pass def del_stu(): pass def sort_stu(): pass while True: print(1)添加学生信息) print(2)查看学生信息) print(3)修改学生信息) print(4)删除学生信息) print(5)排序学生信息) print(6)退出系统) num input(请选择功能菜单前的序号) if num 1: add_stu() elif num 2: get_stu() elif num 3: change_stu() elif num 4: del_stu() elif num 5: sort_stu() elif num 6: print(退出成功~) exit() else: print(输入错误请重新输入【1~6】之间的数字)先确定框架该程序为学生管理系统需要完成增删改查这四项基本功能外加一个排序功能。对于很多管理系统来说增删改查是基本功能。可以先把这五个功能的函数写出来方便后续调用。写好调用函数后把菜单写清楚。功能键和调用函数对应完善细节现在只需要写好调用函数就行。该程序用到了很多循环内循环的循环嵌套需要注意层次对应。其中student[:]使用它是要避免循环历遍函数时漏掉元素。举个例子若student [1,2,3,4,5]循环语句为 for stu in student:当函数student.remove(1)时:循环指针指向索引 0元素1执行删除元素1列表变成[2,3,4,5]后面所有元素整体往前挪一位。循环指针自动 1现在指向索引 1原索引 2 的元素 3再次remove会删除元素3。元素 2 直接被跳过没有被遍历到就会漏掉元素。student[:]是列表切片会生成原列表的一份拷贝副本。遍历原列表同时删除元素会跳过元素遍历副本student[:]就不会漏掉元素感谢读文觉得好用的留下你的足迹吧