Python攻克之路-三级菜单(优化版本)
三级菜单优化版本
描述:三级的代码基本都是一样的,只有进入不同的层是不一样的,每次循环时让它自身知道去记录那一层就可以了
menu = { ... }


1. 设置一个变量来记录当前层,循环时,只循环current_layer,不循环menu这个字典,因为current_layer是可以随时改变的,第一次循环时把整个字典meun赋值给current_layer,第二次循环时把menu字典下的beijing赋值给它,相当于循环beijing,第三次循环时把changping赋值给它
current_layer = menu #第一次循环是menu
while True:
for key in current_layer: ##直接循环第一层
print(key)
choice = input(">>> ").strip()
if len(choice) == 0:continue ##如果用户输入的长度为0,就要让它重新再输入,continue继续
2. 对用户输入的进行判断是否在菜单里,不用再打印,让它利用上一次的循环进入到下一层
if choice in current_layer:
current_layer = current_layer[choice] #current_layer是动态的变量,可以是第二层,可以是第三层
else:
print('Not exist')
3.回退功能的实现,现在问题是通每层的父层找到下一层,程序无法通过子层找到父层,但是可以要每进入下一层之前,把父层记录下来parent_layer = menu,最开始的状态是menu
if choice in current_layer:
parent_layer = current_layer ##因为输入choice后,马上就进入下一层,这里直接记录现在所在层
current_layer = current_layer[choice] ##进入到子层,只是等于子层,要回到最上代码for key in current_layer:才给用户选择
elif choice == 'b':
current_layer = parent_layer ##刚才记录是父层,所以回退时直接等于parent_layer
注意:parent_layer = current_layer 时,有个问题,记录父级时,从父层进入子层,是可以实现,但是再进入子层,这时记录的就把上次的值覆盖
4.解决parent_layer只记录一层的问题,如果使用字典会涉及那个是键,那个是值的问题,所以使用列表来实现,如[1,2,3],每一层相当于存它的父层,如进入第1层就是存第1层,进入第3层时要存第2层,如果要返回只是取最后一个值就可以,进入第4层就记录第三层,直接把3这个值取出来就行
parent_layers = [] #全局中定义一个空格列表,保存所有父层,最后一个元素永远都是父级
if choice in current_layer:
parent_layers.append(current_layer) ##修改成,每进入下一层,就追加现在,也就是下一层的父层
current_layer = current_layer[choice]
elif choice == 'b':
if parent_layers: ##本身定义是空,这里如果为空就false就不会再执行pop,以避免退出最后一层时报错
current_layer = parent_layers.pop() ##返回到上层就弹出一个值
完整代码
menu = { 'Beijing':{ 'Chaoyang':{ 'Guomao':{ 'CICC':{}, 'HP':{}, 'Zadayinhang':{}, 'CCTV':{}, }, 'Wangjing':{ 'Momo':{}, 'Benz':{}, '360':{}, }, 'Sanlitun':{ 'Youyiku':{}, 'apple':{}, }, }, 'Changping':{ 'Shahe':{ 'Etiantian':{}, 'Atai':{}, }, 'Tiantongyan':{ 'Lianjia':{}, 'Woaiwojia':{}, }, 'Huilongguan':{}, }, 'Haidian':{ 'Wudaokou':{ 'Google':{}, 'Wangyi':{}, 'Shouhu':{}, 'Sogu':{}, 'Kuaishou':{}, }, "Zhongguancun":{ 'Youku':{}, 'Iqiyi':{}, 'Qichezhijia':{}, 'Xindongfang':{}, 'qq':{}, } }, }, 'Shanghai':{ 'Budong':{ 'Lujia':{ 'CICC':{}, 'Gaosheng':{}, 'Mogeng':{}, }, 'Waitang':{}, }, 'Minhang':{}, 'Jingan':{}, }, 'Shandong':{ 'Jinan':{}, 'Dezhou':{ 'Leling':{ 'Dingwuzhen':{}, 'Chenqu':{}, }, 'Pingyuan':{}, }, 'Qindao':{}, }, }
#!/usr/local/python3/bin/python3
#
menu = { ... }
current_layer = menu
parent_layers = []
while True:
for key in current_layer:
print(key)
choice = input(">>> ").strip()
if len(choice) == 0:continue
if choice in current_layer:
parent_layers.append(current_layer)
current_layer = current_layer[choice]
elif choice == 'b':
if parent_layers:
current_layer = parent_layers.pop()
else:
print('Not exist')

浙公网安备 33010602011771号