python学习之路-练习小程序03(三级菜单)
需求: 可依次选择进入各子菜单 可从任意一层往回退到上一层 可从任意一层退出程序 所需新知识点:列表、字典
1.基础版:
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author:zengwenhai # 三级菜单 menu = { '湖南省':{ '郴州市':{ '嘉禾县':{ '珠泉镇':{}, '袁家镇':{}, '泮头乡':{} }, '汝城县':{ '土桥镇':{}, '永丰乡':{}, '田庄':{} }, '安仁县':{ '灵官镇':{}, '关山镇':{} } }, '常德市':{ '汉寿县':{ '蒋家嘴镇':{}, '坡头镇':{} }, '安乡县':{ '安丰乡':{}, '安生乡':{} }, '桃源县':{} } }, '广东省':{ '深圳市':{ '宝安区':{ '西乡':{}, '固戍':{} }, '南山':{ '中兴':{}, '深圳大学':{} } }, '广州市':{ '越秀区':{ '火车站':{}, '越秀公园':{} } }, }, } stop_flag = False # 定义一个循环各级菜单的标志位,这个标志的作用:当用户输入某个字符时停留在本级菜单上 break_flag = False # 定义一个循环各级菜单的标志位,这个标志的作用:当用户输入某个字符时返回上一级菜单上 flag_list = ['s','b'] # 用来判断输入的菜单名是s或b时,不会提示:第xx级菜单名输入错误,请重新输入 while not break_flag: print("第一级菜单>>>>>") print("==========") for k in menu: print(k) print("==========================================================") choicename = input("请输入第一级菜单名[s|S跳出程序---b|B返回上一级菜单]:").strip().lower() # 去除输入项左右空格,如果是输入字母,统一转换为小写 print("==========") if choicename in menu: while not stop_flag and not break_flag: for k1 in menu[choicename]: print(k1) print("==========================================================") choicename1 = input("请输入第二级菜单名[s|S跳出程序---b|B返回上一级菜单]:").strip().lower() print("==========") if choicename1 == 's': # 当输入的是s时,跳出程序 exit() elif choicename1 == 'b': # 当输入b时,将break_flag标志置为True,本循环层不开始,返回上一层 break_flag = True if choicename1 in menu[choicename]: print("第三级菜单名") print("==========") while not stop_flag and not break_flag: for k2 in menu[choicename][choicename1]: print(k2) print("==========================================================") choicename2 = input("请输入第三级菜单名[s|S跳出程序---b|B返回上一级菜单]:").strip().lower() if choicename2 == 's': exit() elif choicename2 == 'b': break_flag = True if choicename2 in menu[choicename][choicename1]: while not stop_flag and not break_flag: print("第四级菜单名") print("==========") for k3 in menu[choicename][choicename1][choicename2]: print(k3) print("==========================================================") choicename3 = input("请输入s或b[s|S停留在本级菜单---b|B返回上一级菜单]:").strip().lower() print("==========") if choicename3 == 's': exit() elif choicename3 == 'b': break_flag = True else: print("这是最后一级菜单") else: # while块下对应的else,如果while循环中未中断,执行此语句,给break_flag标志位重新赋值为False,确保第三级菜单可以正常循环 break_flag = False elif choicename2 in flag_list: # 此处是避免输入s或b,程序停在当前菜单层或返回上级菜单层时提示:第xx级菜单名输入错误,请重新输入ps.不加这个判断的话,程序会返回上级菜单,但是也会报菜单名错误 pass else: print("第三级菜单名输入错误,请重新输入") else: # while块下对应的else,如果while循环中未中断,执行此语句,给break_flag标志位重新赋值为False,确保第二级菜单可以正常循环 break_flag = False elif choicename1 in flag_list: pass else: print("第二级菜单名输入错误,请重新输入") else: # while块下对应的else,如果while循环中未中断,执行此语句,给break_flag标志位重新赋值为False,确保第一级菜单可以正常循环 break_flag = False elif choicename in flag_list: pass else: print("第一级菜单名输入错误,请重新输入!")
2.升级版:
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author:zengwenhai # 三级菜单 menu = { '湖南省':{ '郴州市':{ '嘉禾县':{ '珠泉镇':{}, '袁家镇':{}, '泮头乡':{} }, '汝城县':{ '土桥镇':{}, '永丰乡':{}, '田庄':{} }, '安仁县':{ '灵官镇':{}, '关山镇':{} } }, '常德市':{ '汉寿县':{ '蒋家嘴镇':{}, '坡头镇':{} }, '安乡县':{ '安丰乡':{}, '安生乡':{} }, '桃源县':{} } }, '广东省':{ '深圳市':{ '宝安区':{ '西乡':{}, '固戍':{} }, '南山':{ '中兴':{}, '深圳大学':{} } }, '广州市':{ '越秀区':{ '火车站':{}, '越秀公园':{} } }, }, } tmp = menu # 用来存储菜单名的临时中间变量 flag = False count = 1 parent_menu = [] # 定义一个空列表,用来存储每次循环后的上级菜单名 while not flag: print("<<<<<<<<打印菜单名>>>>>>>>") for k in tmp: print(k) choice = input("请输入菜单名[s|S跳出程序---b|B返回上一级菜单]:").strip().lower() if choice in tmp: parent_menu.append(tmp) # 把上级菜单名添加到列表里 tmp = tmp[choice] elif choice == 'b': if parent_menu: # 判断列表非空,不加判断的话,从最末级菜单层层返回上级菜单,最后列表会变为空,再执行pop方法时报错 tmp = parent_menu.pop() # 通过pop方法取出上级菜单名,并重新赋值给中间变量 elif choice == 's': exit() else: print("菜单名输入错误,请重新输入")