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

为何嵌套if-else实现多层选项菜单时出现缩进块错误?

问题:嵌套if-else出现"expected indented block"错误

我想实现一个可展开为多选项的按钮来缩小用户搜索范围,没找到现成功能,就尝试用while和if-else来实现。第一层选项能正常运行,但添加嵌套if-else时,else行始终提示“expected indented block”错误,请问有没有解决方案?或者是不是我对if-else语句的理解有误?

相关代码如下:

load_titanic("titanic.csv")
print("Welcome to the Titanic Dataset Explorer")
option = "A"

while option.upper() != "Q":
    print()
    print("Select an option")
    print("(1) Display number of families that embarked from each port")
    # (1) cherboug: , queenstown: , southampton:
    print("(2) Display families boat status")
    # (2) display no. fam same boat, no. fam diff boat, no. of fam no boat

    print("(Q) Quit")
    option = input("> ")
    print()

    # add additional option as terminal cannot load all
    if option == "1":
        option2 = "B"
        while option2.upper() != "Return":
            print()
            print("Select Display Method")
            print("(1)Display Only Cherboug Passengers")
            print("(2)Display Only Queenstown Passengers")
            print("(3)Display Only Southampton Passengers")
            print("(4)Display All")
            print("(R)Return")
            option2 = input("> ")
            print()

            if option2 == "1":
                display_fam_boat_stat()

            elif option2 == "2":
                display_fam_boat_stat()

            elif option2 == "3":
                display_fam_boat_stat()

            elif option2 == "4":
                display_fam_embkall()

            elif option2.upper() == "R":
            
            else:                               # <Expected indented block
                print("Invalid option")
                print()

        

    elif option == "2":
        display_fam_boat_stat()

    elif option.upper() == "Q":
        print("Thank you for using the Titanic Dataset Explorer")
    else:
        print("Invalid option")
        print()

解决方案

错误原因

Python语法强制要求:每个if/elif/else分支必须包含至少一个缩进的代码块,哪怕这个分支不需要执行任何逻辑,也得用pass语句占位。你代码里的elif option2.upper() == "R":后面是空的,没有任何代码,所以Python抛出了"expected indented block"错误。

另外还有一个逻辑问题:外层while循环的判断条件option2.upper() != "Return"和用户输入的(R)Return不匹配,输入R后循环不会退出,需要改成option2.upper() != "R"。

修改后的代码

load_titanic("titanic.csv")
print("Welcome to the Titanic Dataset Explorer")
option = "A"

while option.upper() != "Q":
    print()
    print("Select an option")
    print("(1) Display number of families that embarked from each port")
    print("(2) Display families boat status")
    print("(Q) Quit")
    option = input("> ")
    print()

    if option == "1":
        option2 = "B"
        # 修正循环判断条件,匹配输入的R
        while option2.upper() != "R":
            print()
            print("Select Display Method")
            print("(1)Display Only Cherboug Passengers")
            print("(2)Display Only Queenstown Passengers")
            print("(3)Display Only Southampton Passengers")
            print("(4)Display All")
            print("(R)Return")
            option2 = input("> ")
            print()

            if option2 == "1":
                display_fam_boat_stat()
            elif option2 == "2":
                display_fam_boat_stat()
            elif option2 == "3":
                display_fam_boat_stat()
            elif option2 == "4":
                display_fam_embkall()
            elif option2.upper() == "R":
                # 用pass占位,也可以添加提示信息
                pass
            else:
                print("Invalid option")
                print()

    elif option == "2":
        display_fam_boat_stat()
    elif option.upper() == "Q":
        print("Thank you for using the Titanic Dataset Explorer")
    else:
        print("Invalid option")
        print()

额外优化提示

  • 可以给R分支添加退出提示,比如print("Returning to main menu..."),代替pass提升用户体验。
  • 重复调用的display_fam_boat_stat()可以考虑传入参数区分不同港口,减少代码冗余。

内容的提问来源于stack exchange,提问作者Joshua Tang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:02:47