Python通讯录字典开发问题:输入校验与循环逻辑修复求助
通讯录输入校验与循环修复方案
需求与问题(翻译自原提问)
需求:实现通讯录字典的输入校验功能——检查姓名和号码是否为空,为空时提示重新输入;自动将姓名首字母转为大写,同时避免代码因报错中断。
问题:当前输入有效内容后,内部循环无法终止,无法返回主菜单,现有代码如下:
telephone_dict = {"Nino":"0123", "Nick": "0234", "Jake":"0345"} menu = 1 while menu !=0: print(""" 1. Add new names and telephone numbers to the dictionary 2. Delete telephone numbers from the dictionary by the given name 3. View the entire telephone dictionary (names and numbers) 4. View/Search for a single entry by name 5. Save Data 6. Load Data 0. Exit """) menu = int(input("Choose menu option: ")) if menu == 1: while True: try: name =(str(input("Enter a name: "))) num =input("Enter a number: ") telephone_dict[name] = num if name == '': print("You did not enter anything, please, try again") elif num == '': print("You did not enter anything, please, try again") except ValueError: print("Invalid Input") continue
问题分析
原代码存在几个核心问题:
- 内部
while True没有终止逻辑,输入有效内容后会一直停在添加流程里,回不去主菜单 - 校验顺序搞反了:先把空的姓名/号码存进字典,才提示重新输入,导致无效数据被存入
- 没做姓名首字母大写的处理
- 异常捕获逻辑无效,
input返回的是字符串,转str不会触发ValueError,白写了异常处理
修正后的代码
telephone_dict = {"Nino":"0123", "Nick": "0234", "Jake":"0345"} menu = 1 while menu != 0: print(""" 1. 添加新的姓名和电话号码到通讯录 2. 根据姓名删除通讯录中的号码 3. 查看整个通讯录(姓名和号码) 4. 根据姓名查询单个条目 5. 保存数据 6. 加载数据 0. 退出 """) # 处理菜单输入异常,避免输非数字崩溃 try: menu = int(input("请选择菜单选项: ")) except ValueError: print("输入无效,请输入数字选项") continue if menu == 1: while True: try: name = input("请输入姓名: ").strip() num = input("请输入电话号码: ").strip() # 先校验空值,空的话直接重新输入 if not name: print("姓名不能为空,请重新输入") continue if not num: print("电话号码不能为空,请重新输入") continue # 姓名首字母大写处理 name = name.capitalize() # 存入通讯录 telephone_dict[name] = num print(f"已成功添加 {name}: {num}") # 询问是否继续添加,控制循环终止 choice = input("是否继续添加?(y/n): ").strip().lower() if choice != 'y': break # 跳出添加循环,回到主菜单 except Exception as e: print(f"输入出错: {e}") continue
关键修改点
- 解决循环无法终止:添加了“是否继续添加”的询问,用户输入非'y'时用
break跳出内部循环,直接回到主菜单 - 调整校验逻辑:先检查姓名和号码是否为空(
strip()去掉首尾空格,避免误输入空格被当成有效内容),不通过就重新输入,通过后再存入字典 - 实现首字母大写:用
capitalize()方法自动把姓名转成首字母大写、其余小写的格式(如果要保留原姓名的其他字母大小写,可以改成name[0].upper() + name[1:],不过已经提前校验过姓名非空,不会报错) - 完善异常处理:菜单输入时捕获非数字的异常,防止程序崩溃;内部添加通用异常捕获,应对各种意外报错
- 优化用户体验:把所有提示改成中文,操作更直观
内容的提问来源于stack exchange,提问作者tab
相关产品推荐
相关产品推荐

