如何避免多层while与if语句,实现多级用户输入验证?
如何摆脱多层嵌套实现多级用户交互与输入校验?
我现在通过嵌套多层while循环、try异常捕获与if判断语句实现了多级用户选项交互及输入合法性校验(原代码如下),想知道怎么不用这类多层嵌套语句完成相同功能?
原代码(注:存在语法错误,如=应改为==,or逻辑判断写法有误)
while True: try: user_choice = int(input("Enter an option 1 or 2")) if user_choice == 1 or 2: if user_choice = 1: while True: try: edit_choice = int(input("Would you like to edit (1) or delete (2)")) if edit_choice == 1 or 2: if edit_choice = 1: # code to offer more options and more while, try and if statements. break elif edit_choice = 2: # code to offer more options and more while, try and if statements. break else: print("\nPlease enter a valid option.") except ValueError: print("\nPlease enter a number.") break elif user_choice = 2: # code to offer more options and more while, try and if statements. break else: print("\nPlease enter a valid option.") except ValueError: print("\nPlease enter a number.")
解决方案
1. 提取通用输入校验函数(最直接的优化)
把重复的输入提示、异常捕获、合法性判断逻辑抽成独立函数,消除嵌套的while和try语句:
def get_valid_int(prompt, valid_options=None): """获取合法的整数输入,支持指定有效选项范围""" while True: try: user_input = int(input(prompt)) # 如果没有指定有效选项,直接返回;否则检查是否在有效范围内 if valid_options is None or user_input in valid_options: return user_input print("\n请输入有效的选项。") except ValueError: print("\n请输入数字。")
用这个函数重构后的代码,完全摆脱嵌套循环和重复的异常处理:
# 主菜单选择 user_choice = get_valid_int("Enter an option 1 or 2: ", valid_options=[1, 2]) if user_choice == 1: # 编辑/删除子菜单选择 edit_choice = get_valid_int("Would you like to edit (1) or delete (2): ", valid_options=[1, 2]) if edit_choice == 1: # 执行编辑逻辑 print("执行编辑操作") elif edit_choice == 2: # 执行删除逻辑 print("执行删除操作") elif user_choice == 2: # 执行选项2的逻辑 print("执行选项2的操作")
2. 状态机+菜单字典(适合复杂多级菜单)
如果菜单层级更多、逻辑更复杂,可以用状态机模式,把每个菜单的配置(提示语、选项、处理函数)用字典定义,通过切换状态实现无嵌套的多级交互:
# 定义各个菜单的处理函数 def handle_edit(): print("进入编辑子菜单,执行编辑逻辑") # 完成后返回下一个要进入的状态 return "main_menu" def handle_delete(): print("进入删除子菜单,执行删除逻辑") return "main_menu" def handle_option2(): print("执行选项2的逻辑") return "main_menu" # 菜单状态配置:键是状态名,值包含提示、选项映射 menu_states = { "main_menu": { "prompt": "Enter an option 1 or 2: ", "options": { 1: {"next_state": "edit_delete_menu"}, 2: {"handler": handle_option2} } }, "edit_delete_menu": { "prompt": "Would you like to edit (1) or delete (2): ", "options": { 1: {"handler": handle_edit}, 2: {"handler": handle_delete} } } } current_state = "main_menu" # 主循环:根据当前状态加载菜单,处理用户选择 while True: state_config = menu_states[current_state] # 获取合法输入 choice = get_valid_int(state_config["prompt"], valid_options=list(state_config["options"].keys())) option = state_config["options"][choice] # 处理选项:如果有next_state则切换状态,否则执行处理函数并更新状态 if "next_state" in option: current_state = option["next_state"] else: current_state = option["handler"]()
这种方式扩展性极强,新增菜单只需在menu_states里添加新的状态配置,无需修改主循环逻辑,彻底消除嵌套。
内容的提问来源于stack exchange,提问作者thebeef
相关产品推荐
相关产品推荐

