为何嵌套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
相关产品推荐
相关产品推荐

