# 需求:
# 可依次选择进入各子菜单
# 可从任意一层往回退到上一层
# 可从任意一层退出程序
# 所需新知识点:列表、字典数据结构:
一.low版:
1 #思路: 2 #使用列表来存放字典的每一层数据,根据索引来选择 3 #后退到上一层可以通过一个while True 循环来控制,break跳出后退 4 5 menu = { 6 '北京':{ 7 '海淀':{ 8 '五道口':{ 9 'soho':{}, 10 '网易':{}, 11 'google':{} 12 }, 13 '中关村':{ 14 '爱奇艺':{}, 15 '汽车之家':{}, 16 'youku':{}, 17 }, 18 '上地':{ 19 '百度':{}, 20 }, 21 }, 22 '昌平':{ 23 '沙河':{ 24 '老男孩':{}, 25 '北航':{}, 26 }, 27 '天通苑':{}, 28 '回龙观':{}, 29 }, 30 '朝阳':{}, 31 '东城':{}, 32 }, 33 '上海':{ 34 '闵行':{ 35 "人民广场":{ 36 '炸鸡店':{} 37 } 38 }, 39 '闸北':{ 40 '火车战':{ 41 '携程':{} 42 } 43 }, 44 '浦东':{}, 45 }, 46 '山东':{}, 47 } 48 49 province_list = list(menu.keys()) #省名称列表 50 51 while True: 52 print("省".center(24,'*')) 53 for i in province_list: 54 print(province_list.index(i)+1,i) #打印出各个省 55 province_choice = input("请输入您所需要选择的省的编号,或者退出(q):") 56 if province_choice.isdigit(): #判断是否为数字 57 province_choice = int(province_choice) #强制转换为数字 58 if province_choice > 0 and province_choice <= len(province_list): #判断输入的数值是否正确 59 province_name = province_list[province_choice-1] #取出选择的省的名称 60 city_list = list(menu[province_name].keys()) #市名称列表 61 while True: 62 print("市".center(24,'*')) 63 for j in city_list: 64 print(city_list.index(j)+1,j) 65 city_choice = input("请输入您所选择的市的编号,返回(r),或者退出(q):") 66 if city_choice.isdigit(): 67 city_choice = int(city_choice) 68 if city_choice > 0 and city_choice <= len(city_list): 69 city_name = city_list[city_choice-1] 70 country_list = list(menu[province_name][city_name].keys()) 71 while True: 72 print("县".center(24,'*')) 73 for k in country_list: 74 print(country_list.index(k)+1,k) 75 country_choice = input("请输入您所选择的县的编号,返回(r),退出(q):") 76 if country_choice.isdigit(): 77 country_choice = int(country_choice) 78 if country_choice > 0 and country_choice <= len(country_list): 79 country_name = country_list[country_choice-1] 80 company_list = list(menu[province_name][city_name][country_name].keys()) 81 while True: 82 print("公司".center(24,'*')) 83 for l in company_list: 84 print(company_list.index(l)+1,l) 85 company_choice = input("返回(r),退出(q):") 86 if company_choice == 'r': 87 break 88 elif company_choice == 'q': 89 exit() 90 else: 91 print("您的输入%s有误!" % (company_choice)) 92 else: 93 print("输入编号%s超限!" % (country_choice)) 94 elif country_choice == 'r': 95 break 96 elif country_choice == 'q': 97 exit() 98 else: 99 print("您的输入%有误!" % (country_choice)) 100 else: 101 print("您输入的编号%s超限!" % (city_choice)) 102 elif city_choice == 'r': 103 break 104 elif city_choice == 'q': 105 exit() 106 else: 107 print("您的输入%s有误!" % (city_choice)) 108 else: 109 print("您的编号%s输入超限!" % (province_choice)) 110 elif province_choice == 'r': 111 break 112 elif province_choice == 'q': 113 exit() 114 else: 115 print("您的输入%s有误!" % (province_choice))
输出结果终端展示:
缺点:重复代码太多
二.高级版:
1 #思路: 2 #1.low版代码有好多重复的代码,设置一个动态的变量来控制 3 menu = {...} 4 current_layer = menu #当前层 5 # last_layer = menu 6 layers = [] # 7 while True: 8 for k in current_layer: 9 print(k) 10 choice = input(">:").strip() 11 if not choice:continue 12 if choice in current_layer: 13 layers.append(current_layer) #进入下一层,保存当前层到列表中 14 current_layer = current_layer[choice] #动态的将下一层变成当前层,然后进行新的循环 15 elif choice == 'b': 16 if len(layers) != 0: #判断列表是否为空 17 current_layer = layers.pop() #将列表最后一个元素取出,并删除掉 18 # current_layer = layers[-1] 19 # del layers[-1] 20 else: 21 print("到达顶层!") 22 elif choice == 'q': 23 exit() 24 else: 25 print("输入有误")
输出结果终端展示:
缺点:layers这个列表会存放大量的数据,占用太多空间,后续继续优化