You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免多层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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:05:36