Python如何将输入值与多个可选值比较?判断逻辑bug修复咨询
错误点拆解
- 条件判断逻辑错误
if choice =='A' or 'a'这类写法不符合Python语法规则,or两侧是独立的布尔运算表达式,非空字符串'a'的布尔值恒为True,所以无论输入什么值,第一个if判断永远成立,直接进入新增联系人逻辑。
- 条件判断逻辑错误
- 无循环逻辑支撑多次操作
代码仅会执行一次菜单判断,即使在分支内重新获取了用户输入的choice,也不会回到判断分支重新匹配对应操作,执行完单个分支后程序就会直接结束。
- 无循环逻辑支撑多次操作
- 集合操作方法误用
修改联系人分支使用update()方法更新集合,update()会将传入的字符串拆分为单个字符逐一存入集合,完全不符合存储完整姓名、邮箱的需求。
- 集合操作方法误用
- 数据存储结构不合理
姓名和邮箱分别存在两个独立的set中,二者没有对应关联,无法实现修改、删除指定联系人的需求,会出现删了姓名还留着邮箱、数据对应错乱的问题。
- 数据存储结构不合理
- 冗余代码
打印菜单时给print()的返回值赋值给v/a/c等变量完全无用,print()的返回值是None,这些变量没有任何使用意义。
- 冗余代码
修复方案
修正逻辑说明
- 把条件判断改为
if choice.lower() == 'a'的写法,可同时匹配大小写输入,逻辑正确 - 加
while True循环包裹菜单和判断逻辑,支持用户多次操作直到选择退出 - 改用字典存储联系人数据,以姓名为key,邮箱为value,保证二者的对应关系
- 修正集合操作的错误,改用字典的增删改方法实现对应功能,同时增加存在性判断避免异常
- 删除冗余的变量赋值代码
修复后完整代码
# 用字典存储联系人,key为姓名,value为邮箱 contacts = {} while True: # 打印菜单 print('-=-=- Menu -=-=-') print('V. View Contacts') print('A. Add New Contact') print('C. Change Contact') print('D. Delete Contact') print('Q. Quit\n') choice = input('Enter your choice: ').strip() if choice.lower() == 'a': print('-=-=- Enter the New Contact Name and Email -=-=-\n') add_name = input('Enter Contact Name: ').strip() if add_name in contacts: print('该联系人已存在!\n') continue add_email = input('Enter Contact Email: ').strip() contacts[add_name] = add_email print('联系人添加成功!\n') elif choice.lower() == 'v': print('-=-=-=-=-=-=-=-=-=-=-=-') print('-=-=-=- Name, Email -=-=-=-') for name, email in contacts.items(): print(f'{name}, {email}') print('\n') elif choice.lower() == 'c': print('-=-=-=-=-=-=-=-=-=-=-=-\n') changed_name = input('Enter Contact Name:').strip() if changed_name not in contacts: print('该联系人不存在!\n') continue changed_email = input('Enter New Contact Email: ').strip() contacts[changed_name] = changed_email print('联系人信息修改成功!\n') elif choice.lower() == 'd': print('-=-=-=-=-=-=-=-=-=-=-=-\n') delete_name = input('Enter Contact Name You Wish to Delete: ').strip() if delete_name not in contacts: print('该联系人不存在!\n') continue del contacts[delete_name] print('联系人删除成功!\n') elif choice.lower() == 'q': print('Goodbye') break else: print('输入无效,请重新选择!\n')
内容的提问来源于stack exchange,提问作者BeanBagels
相关产品推荐
相关产品推荐

