""" 需求: 1. 先打印提示界面(1-6的数字), 让用户选择他/她要进行的操作. 2. 当用户选择1的时候, 实现操作: 添加学生(学生编号, 学生姓名, 手机号). 3. 当用户选择2的时候, 实现操作: 删除学生(根据编号删除) 4. 当用户选择3的时候, 实现操作: 修改学生信息(只能改姓名, 手机号) 5. 当用户选择4的时候, 实现操作: 查询单个学生信息(根据姓名查) 6. 当用户选择5的时候, 实现操作: 查询所有学生信息 7. 当用户选择6的时候, 实现操作: 退出系统 思路: 1. 定义函数 print_info(), 用来打印: 提示信息. 2. 定义函数 student_cms(), 表示: 具体的业务逻辑. Content Management System: 内容管理系统 3. 定义函数 add_info(), 用来表示: 添加学生信息(编号, 姓名, 手机号) 细节: 学号具有唯一性, 姓名可以重复. 4. 定义函数 del_info(), 用来表示: 删除学生信息. 思路1: 根据 学号 删除. del_by_id() 思路2: 根据 姓名 删除. del_by_name() 5. 定义函数 update_info(), 用来表示: 修改学生信息. 细节: 根据学号来修改 姓名, 手机号. 6. 定义函数 search_one(), 用来表示: 查询单个学生信息. 思路1: 根据 学号 查询. search_by_id() 思路2: 根据 姓名 查询. search_by_name() 7. 定义函数 search_all(), 用来表示: 查询所有学生信息. 细节: 有可能暂无学生信息, 查询时要进行对应的提示. 可以优化的地方: 1. 对手机号做限定, 合法手机号, 且唯一. 2. 根据姓名删除时, 有三种情况: 场景1: 该姓名不存在, 直接提示即可. 场景2: 该姓名只有1个, 直接删除并提示即可. 场景3: 该姓名有多个, 就把该姓名所有的信息都打印出来, 提示给用户最选择, 例如: 1 => 删除所有, 2 => 录入某个id, 进行指定删除, 其他 => 非法信息, 重新操作! 3. 修改的动作. 场景1: 根据学号 修改 => 姓名, 手机号. 场景2: 根据 姓名 修改, 找不到就提示, 找到了就打印所有该姓名的学生信息, 提示用户进行具体操作. 例如: 1 => 录入某个id, 进行指定修改, 其他 => 非法信息, 重新操作! """ # 1. 定义函数 print_info(), 用来打印: 提示信息. def print_info(): """ 自定义的函数, 用于打印: 提示信息的. :return: 无 """ # print('-' * 30) # print('欢迎来到学生管理系统, 已研发功能如下:') print('1.添加学生') print('2.删除学生') print('3.修改学生信息') print('4.查询单个学生信息') print('5.查询所有学生信息') print('6.退出系统') # print('-' * 30) # 2. 定义函数 student_cms(), 表示: 具体的业务逻辑. Content Management System: 内容管理系统 def student_cms(): # 2.1 因为要重复做, 所以加入: while True循环. while True: # 2.2 调用 print_info(), 打印提示信息. print_info() # 2.3 提示用户录入他/她要操作的编号, 并接收. input_num = input('请录入您要操作的编号: ') # '1', '2'... # 2.4 根据用户录入的编号, 进行对应的操作. if input_num == '1': # print('添加学生信息\n') add_info() # 调用函数, 完成添加学生信息的动作. elif input_num == '2': # print('删除学生\n') del_info() elif input_num == '3': # print('修改学生信息\n') update_info() elif input_num == '4': # print('查询单个学生信息\n') search_one() elif input_num == '5': # print('查询所有学生信息\n') search_all() # 调用函数, 查看所有学生信息. elif input_num == '6': print('谢谢您的使用, 期待下次再会!') break # 结束循环. else: print('录入有误, 请重新录入!\n') # 3. 定义函数 add_info(), 用来表示: 添加学生信息(编号, 姓名, 手机号) # 细节: 学号具有唯一性, 姓名可以重复. # 3.1 定义 stu_info(列表嵌套字典), 用来存储学生信息. stu_info = [] # 这个才是合法的基于业务定义的变量. # 目前是测试节点, 为了防止每次都要大量的重复的添加数据, 我们可以手动先给一下测试数据, 项目正式上线的时候, 删除即可. # stu_info = [ # {'id': 'student01', 'name': '乔峰', 'phone': '111'}, # {'id': 'student02', 'name': '虚竹', 'phone': '222'}, # {'id': 'student03', 'name': '段誉', 'phone': '333'}, # {'id': 'student04', 'name': '段誉', 'phone': '333'}, # {'id': 'student05', 'name': '段誉', 'phone': '333'} # ] # 3.2 定义函数, 完成具体的 添加学生信息的动作. def add_info(): # 3.3 提示用户录入学生的学号, 并接收. new_id = input('请录入要添加的学生编号:') # 3.4 遍历学生列表, 看该学号是否存在, 如果存在, 则提示用户学号已存在, 程序结束. for stu in stu_info: # stu就是每个学生的信息, 格式为: {'id': 'student01', 'name': '乔峰', 'phone': '111'} # 判断学号是否存在. if stu['id'] == new_id: print(f'学号 {new_id}已存在, 请重新操作!\n') break # 记得break, 表示: 添加动作结束. else: # 3.5 走到这里, 说明学号不存在, 可以添加. 即: 提示用户录入他/她的 姓名和手机号. new_name = input('请录入要添加的学生姓名:') new_phone = input('请录入要添加的学生手机号:') # 3.6 把上述的学生信息, 封装成 字典. new_stu = {'id': new_id, 'name': new_name, 'phone': new_phone} # 3.7 把封装好的学生信息(字典形式), 添加到学生列表中. stu_info.append(new_stu) # 3.8 提示用户添加成功. print('添加学生信息成功!\n') # 4. 定义函数 del_info(), 用来表示: 删除学生信息. # 思路1: 根据 学号(唯一) 删除. del_by_id() def del_by_id(): # 4.1 提示用户录入要删除的学号, 并接收. del_id = input('请录入要删除的学生编号: ') # 4.2 遍历学生列表 stu_info, 看有无该学生信息. for stu in stu_info: # stu就是每个学生的信息, 格式为: {'id': 'heima01', 'name': '乔峰', 'phone': '111'} # 4.3 判断学号是否存在. if stu['id'] == del_id: # 4.4 走这里, 说明学号存在, 删除, 并提示即可. stu_info.remove(stu) print(f'删除学号为 {del_id} 的学生信息成功!\n') # 记得 break break else: # 4.5 走到这里, 说明学号不存在. print(f'该学号 {del_id} 不存在, 请重新操作!\n') # 思路2: 根据 姓名(可重复) 删除. del_by_name() def del_by_name(): # 4.0 采用 标记变量 思维, 判断 是否有删除学生信息. flag = False # True: 删除学生信息了, False: 没有删除学生信息. # 4.1 提示用户录入要删除的学生姓名, 并接收. del_name = input('请录入要删除的学生姓名: ') # 4.2 遍历学生列表 stu_info, 看有无该学生信息. i = 0 while i < len(stu_info): # i 就是每个学生的 索引信息. # stu_info[i] 每个学生的信息, 格式为: {'id': 'student01', 'name': '乔峰', 'phone': '111'} # 4.3 判断 姓名 是否存在. if stu_info[i]['name'] == del_name: # 4.4 走这里, 说明姓名存在, 删除, 并提示即可. # stu_info.remove(stu_info[i]) stu_info.pop(i) # 索引要 - 1 i -= 1 # 删除学生信息了, 记得修改标记变量的状态. flag = True # 4.5 走到这里, 说明当前学生信息校验完毕, 校验下个学生信息即可. i += 1 # 4.6 根据flag变量的值, 进行对应的提示即可. # if flag: # print(f'该姓名 {del_name} 删除成功!\n') # else: # print(f'该姓名 {del_name} 不存在, 请重新操作!\n') print(f'该姓名 {del_name} 删除成功!\n' if flag else f'该姓名 {del_name} 不存在, 请重新操作!\n') # 优化: 把上述的两个函数, 封装成1个函数即可, 具体如下 def del_info(): # (再次)询问用户, 根据id删, 还是根据姓名删. input_n = input('请选择删除方式, 1:根据id删, 2:根据姓名删, 输入其它键则返回主界面: ') if input_n == '1': del_by_id() # 调用函数, 完成删除学生信息的动作. 根据id删 elif input_n == '2': del_by_name() # 调用函数, 完成删除学生信息的动作. 根据姓名删. else: print('录入有误, 请重新操作!\n') # 5.定义函数 update_info(), 用来表示: 修改学生信息. # 细节: 根据学号来修改 姓名, 手机号. def update_info(): # 5.1 提示用户录入要修改的学号, 并接收. update_id = input('请录入要修改信息的学号: ') # 5.2 判断该学号是否存在. for stu in stu_info: # stu就是每个学生的信息, 格式为: {'id': 'student01', 'name': '乔峰', 'phone': '111'} # 5.3 走这里, 说明 id存在. if stu['id'] == update_id: # 5.4 提示用户录入修改后的学生信息(姓名, 手机号) new_name = input('请录入修改后的学生姓名: ') new_phone = input('请录入修改后的手机号: ') # 5.5 用新的信息 => 替换(覆盖)之前旧的信息. stu['name'] = new_name # 因为字典属于可变类型, 所以直接改值即可. stu['phone'] = new_phone # 5.6 提示 print(f'学号为 {update_id} 的学生信息, 修改成功!\n') # 5.7 细节 break # 学号具有唯一性. else: # 5.8 走这里, 说明 没找到这个学号, 提示即可. print(f'学号为 {update_id} 的学生信息不存在, 请重新操作!\n') # 6. 定义函数 search_one(), 用来表示: 查询单个学生信息. # 思路1: 根据 学号(唯一) 查询. search_by_id() def search_by_id(): # 6.1 提示用户录入要查询的学号, 并接收. search_id = input('请录入要查询的学生编号: ') # 6.2 遍历学生列表 stu_info, 看有无该学生信息. for stu in stu_info: # 6.3 走这里, 说明学号存在, 打印学生信息即可. if stu['id'] == search_id: print(f"学号: {stu['id']}, 姓名: {stu['name']}, 手机号: {stu['phone']}\n") # 细节: 学号具有唯一性, 找到了就break break else: # 6.4 走这里, 说明没找到, 提示即可. print(f'该学号 {search_id} 不存在, 请重新操作!\n') # 思路2: 根据 姓名(可重复) 查询. search_by_name() def search_by_name(): # 6.0 标记变量思想. flag = False # True: 查询到了, False: 没查询到. # 6.1 提示用户录入要查询的学生姓名, 并接收. search_name = input('请录入要查询的学生姓名: ') # 6.2 遍历学生列表 stu_info, 看有无该学生信息. for stu in stu_info: # 6.3 走这里, 说明 姓名 存在, 打印学生信息即可. if stu['name'] == search_name: print(f"学号: {stu['id']}, 姓名: {stu['name']}, 手机号: {stu['phone']}") # 细节: 修改标记变量的状态. flag = True # # 6.4 根据标记变量的结果, 进行提示即可. # if not flag: # # 走这里, 说明没找到. # print(f'姓名为 {search_name} 的学生信息不存在, 请重新操作!\n') # else: # # 6.5 走到这里, 说明找到了, 加个换行即可, 效果更好看. # print() # 优化版, 上述的if.else 可以用 三元表达式 来替换. print(f'姓名为 {search_name} 的学生信息不存在, 请重新操作!\n' if not flag else '') # 优化: 把上述的两个函数, 封装成1个函数即可, 具体如下 def search_one(): # (再次)询问用户, 根据id查, 还是根据姓名查. input_n = input('请选择查询方式, 1:根据id查, 2:根据姓名查, 输入其它键则返回主界面: ') if input_n == '1': search_by_id() # 调用函数, 完成查询学生信息的动作. 根据id查 elif input_n == '2': search_by_name() # 调用函数, 完成查询学生信息的动作. 根据姓名查. else: print('录入有误, 请重新操作!\n') # 7. 定义函数 search_all(), 用来表示: 查询所有学生信息. # 细节: 有可能暂无学生信息, 查询时要进行对应的提示. def search_all(): # 7.1 判断是否有学生信息. if len(stu_info) > 0: # if stu_info: # 7.2 走这里, 说明有学生信息, 打印即可. for stu in stu_info: print(f"学号: {stu['id']}, 姓名: {stu['name']}, 手机号: {stu['phone']}") print() # 打印完所有学生信息后, 加个换行, 更好看. else: # 7.3 走这里, 说明暂无学生信息, 提示即可. print('暂无学生信息, 请添加后再查询!\n') # 在main方法中测试. if __name__ == '__main__': # 启动学生管理系统. student_cms()
学生管理系统(列表嵌套字典)
于 2024-08-20 20:24:20 首次发布