学习了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('请输入正确的!')