需求:
1.运行程序输出第一级菜单
2.选择一级菜单某项,输出二级菜单,同理输出三级菜单
3.输入出错重新选择
4.进入每一层支持返回上一级和退出
5.进入最后一层提醒
实现方法一:
# __author:"CGK"
# date: 2022/7/12
menu = {
'浙江': {
'杭州': {
'余杭区': {
'仓前街道': {},
'五常街道': {},
'闲林街道': {},
},
'滨江区': {
'长河街道': {},
'浦沿街道': {},
'西兴街道': {},
},
'西湖区': {
'北山街道': {},
'古荡街道': {},
'留下街道': {},
},
},
'宁波': {
'慈溪': {
'庵东镇': {},
'白沙路街道': {},
'长河镇': {},
},
'北仑区': {
'梅山街道': {},
'小港街道': {},
'郭巨街道': {},
},
'海曙区': {
'桥洞镇': {},
'白云街道': {},
'古林镇': {},
},
},
'金华市': {
'东阳市': {
'城东街道': {},
'东阳江镇': {},
'横店镇': {},
},
'兰溪市': {
'黄店镇': {},
'马涧镇': {},
'灵洞乡': {},
},
'金东区': {
'江东镇': {},
'傅村镇': {},
'岭下镇': {},
},
},
},
'北京': {
'朝阳': {
'安贞街道': {},
'奥运村街道': {},
'八里庄街道': {},
},
'大兴': {
'安定镇': {},
'子长营镇': {},
'黄村镇': {},
},
'东城': {
'安定门街道': {},
'东花市街道': {},
'东华门街道': {},
},
},
'广东省': {
'广州市': {
'越秀区': {
'白云街道': {},
'东大街道': {},
'东山街道': {},
'光塔街道': {},
},
'天河区': {
'长兴街道': {},
'黄村街道': {},
'凤凰街道': {},
'林和街道': {},
},
'花都区': {
'花东镇': {},
'花山镇': {},
'狮岭镇': {},
'梯面镇': {},
},
},
'佛山市': {
'禅城区': {
'南庄镇': {},
'石湾镇街道': {},
'祖庙街道': {},
},
'高明区': {
'对川茶场': {},
'明城镇': {},
'杨和镇': {},
'更合镇': {},
},
'南海区': {
'大沥镇': {},
'九江镇': {},
'里水镇': {},
'狮山镇': {},
},
'三水区': {
'大塘镇': {},
'乐平镇': {},
'南山镇': {},
'西南街道': {},
},
},
},
}
back_flag = False
quit_flag = False
while not back_flag and not quit_flag: # False
for key in menu: # 首次循环key
print(key) # 打印第一级菜单
choice = input('1>>:').strip() # 输入的是一级菜单的key
if choice == 'q':
quit_flag = True
print('下次再见')
if choice in menu: # 判断第一层是否包含用户输入的内容
while not back_flag and not quit_flag: # False
for key2 in menu[choice]:
print(key2)
choice2 = input('2>>:').strip() # 输入的是二级菜单的key
if choice2 == 'b':
back_flag = True
if choice2 == 'q':
quit_flag = True
print('下次再见')
if choice2 in menu[choice]: # 判断第二层是否包含用户输入的内容
while not back_flag and not quit_flag: # False
for key3 in menu[choice][choice2]:
print(key3)
choice3 = input('3>>:').strip() # 输入的是三级菜单的key
if choice3 == 'b':
back_flag = True
if choice3 == 'q':
quit_flag = True
print('下次再见')
if choice3 in menu[choice][choice2]: # 判断第三层是否包含用户输入的内容
while not back_flag and not quit_flag: # False
for key4 in menu[choice][choice2][choice3]:
print(key4)
choice4 = input('最后一层,按b返回,按q退出>>:')
if choice4 == 'b':
back_flag = True
if choice4 == 'q':
quit_flag = True
print('下次再见')
else:
back_flag = False
else:
back_flag = False
else:
back_flag = False
实现方法二:
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:
# 进入下一层之前,把当前层(也就是下一层父级)追加到列表中。下一次loop,当用户选择b,就可以直接取列表的最后一个值
parent_layers.append(current_layer)
current_layer = current_layer[choice] # 改成了子层
elif choice == 'b':
if parent_layers:
current_layer = parent_layers.pop() # 取出列表的最后一个值(也就是当前层的父级)
else:
print('内容不存在!')