三级菜单制作详解
学习了while if for 等循环语句以及 字典、列表、字符串的基础知识后可以尝试做一下下面这个习题:
制作一个三级菜单,一级菜单为 3个省,二级菜单分别为该省下的3个市,三级菜单为该市下的几个县,要求程序开始时显示省的名称,输入名称显示该省下的市的名称,输入市后显示该市下的县的名称,直至输入县正确打印已到达该县,并且随时输入 quit 程序退出,输入 up 回到上级菜单输错了进行提示并重新输入。
我的思路是首先创造一个大字典,通过多层嵌套的方法把三级菜单涉及的省市县添加其中,通过while和if循环达到多层菜单的目的。
map = { '辽宁':{'沈阳':['新民','辽中','辽阳','大民屯'],'大连':['车家村','星海']}, '吉林':{'通化':['快大','新宾','李家堡','王沟'],'敦化':['大石头','增益','西山']}, '新疆':{'阿克苏':['库车','库尔勒','栏杆村'],'乌鲁木齐':['昌吉','血站']} } while 1: flag = 1 province = input('请输入要前往的省份\n %s :' %(list(map.keys()))) if (str(province) in map.keys()): while flag ==1: city = input('请输入要前往的市\n回到上层菜单请输入 up\n %s :' % (list(map[province].keys()))) while city != 'up': if (str(city) in map[province].keys()): county = input('请输入要前往的县\n回到上层菜单请输入 up\n %s :' % (list(map[province][city]))) if county != 'up': if (str(county) in map[province][city]): print('好的!您已到达%s县啦' % county) city = 'quit' province = 'quit' flag =0 break elif county == 'quit': city = 'quit' province = 'quit' flag = 0 break else: print('请输入正确的县!') else: flag = 1 break elif city == 'quit': province = 'quit' flag = 0 break else: print('请输入正确的城市!') if city == 'quit': province = 'quit' flag = 0 break flag = 0 elif province == 'quit': break else: print('请输入正确的省份!') if province == 'quit': break
通过把字典元素加入到input函数中减少了代码行数,不过也导致标志位较多,应该还可以精简,可以作为以后的课题。
经过一天的研习,我发现这代码完全可以再次精简,首先上面的代码可以把每次的输入变量定为一个,然后仅用一个标志位就可以了。
然后我发现竟然还可以精简!!,将3次循环的三级登录转为一级循环,具体代码如下:
map = { '辽宁':{ '沈阳':{ '新民':{}, '辽中':{}, '辽阳':{}, '大民屯':{} }, '大连':{ '车家村':{}, '星海':{} } }, '吉林':{ '通化':{ '快大':{}, '新宾':{}, '李家堡':{}, '王沟':{} }, '敦化':{ '大石头':{}, '增益':{}, '西山':{} } }, '新疆':{ '阿克苏':{ '库车':{}, '库尔勒':{}, '栏杆村':{} }, '乌鲁木齐':{'昌吉':{}, '血站':{} } } } layer = map while True : # choice = input('>>>:%s'% list(layer.keys())) for key in layer:print(key,end='') choice = input('>>>: ').strip() if choice in layer: layer_backup = layer layer=layer[choice] elif choice == 'q': break elif choice == 'b': layer = layer_backup else: print('请输入正确的!')
这样就仅用12行代码解决了
上面的经过检查发现返回只能返回一次,后来研究出了这样的办法,把layer加到一个列表里,通过append 和pop就可以实现多层菜单了
调整为
layer = map layer_backup=[] while True : # choice = input('>>>:%s'% list(layer.keys())) for key in layer:print(key,end='') choice = input('>>>: ').strip() if choice in layer: layer_backup.append(layer) layer=layer[choice] elif choice == 'q': break elif choice == 'b': layer = layer_backup.pop() else: print('请输入正确的!')