需求:
编写三级菜单 1.菜单需求: 一级菜单: 北京 山西 二级菜单: 朝阳 昌平 长治 大同 三级菜单:三里屯 工体 沙河 西二旗 潞城 黎城 阳高县 左云县 2.任何一级都可以输入b返回上一级,输入q退出。 3.知识涵盖字典、列表、for循环、while循环、字符串格式化
流程图:
python代码
#!/bin/bash/env python #python3.X #定义三级菜单字典zone zone = { '北京':{ '朝阳':['三里屯','工体' ], '昌平':['沙河','西二旗' ] }, '山西':{ '长治':['潞城', '黎城' ], '大同':['阳高县','左云县'] } } #定义省级列表 province_list = list(zone.keys()) #打印省级列表循环 while True: print("欢迎光临省级列表".center(20,'-')) #循环省级列表 for i in province_list: #打印省级列表序号和省级名称 print(province_list.index(i)+1,i) #提示输入 p1 = input("请选择序号:例:1 [输入q:退出]") #判断输入的是否全是数字 if p1.isdigit(): #如果输入的是数字,用int进行强制转换成××× p1 = int(p1) #如果p1 大于0或者小于等于省级列表的参数数量 if p1 >0 and p1 <= len(province_list): #求出省级名称 province_name = province_list[p1-1] #求出省级下边的市级列表 city_list = list(zone[province_name].keys()) #打印市级列表循环 while True: print("欢迎光临市级列表".center(20, '-')) #循环市级列表 for c in city_list: #打印市级列表序号和市级列表名称 print(city_list.index(c)+1,c) #提示输入 c1 = input("请选择序号:例:1 [输入b:返回上一级][输入q:退出]") #判断是否输入的是数字 if c1.isdigit(): c1 = int(c1) #如果输入的序号在市级列表序列之内,打印列表,不在,告知不在。 if c1 >0 and c1 <= len(city_list): #求出市级列表的名称 city_name = city_list[c1-1] #求出市级下边的县级列表: county_list = list(zone[province_name][city_name]) #县级列表循环 while True: print("欢迎光临县级列表".center(20,"-")) #循环县级列表 for c2 in county_list: #打印县级列表 print(county_list.index(c2)+1,c2) #提示输入 c2 = input("请输入相应符号:[输入b:返回上一级][输入q:退出]") #如果输入是b 退出这个循环 if c2 == "b": break #如果输入的是q 退出整个循环 elif c2 == "q": #exit() 代表退出整个循环 exit() #如果输入的不是b、q 就提示重新输入 else: print("\033[31m输入错误,Please re-enter!\033[0m") else: print("\n输入的序号%d不在此列表中!Please RE-enter!\n"%c1) #如果输入的是b 退出这个循环 elif c1 == "b": break #如果输入的是q 退出整个程序 elif c1 == "q": exit() #如果输入的不是数字、b 、q 那么提示 重新输入 else: print("\033[31m输入错误,Please re-enter!\033[0m") else: print("\n输入的%d不在此列表中!Please RE-enter!\n"%p1) #如果不是数字,看是否是 字母q elif p1 == "q": #如果是q 执行exit()退出整个程序 exit() #如果输入的不是数字和q,提示重新输入 else: print("\033[31m输入错误,Please re-enter!\033[0m")
三级菜单优化版:
#!/bin/bash/env python # _*_ coding:utf-8 _*_ # python version: 3.x # author: 506554897 ''' 作业:三级菜单 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, '优酷':{}, } }, '上海':{ } } 需求: 可依次选择进入各子菜单 可从任意一层往回退到上一层 可从任意一层退出程序 ''' # 三级菜单 menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': { '百度': {}, '腾讯': {} }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': { '链家地产': {}, '天兰尾货': {} }, '回龙观': { 'H3C': {}, '积水潭医院': {} }, }, }, '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, } } # 定义全局变量 temp_menu_list = [] # 临时菜单列表(动态的) current_menu_dic = menu # 当前的菜单字典 count = 1 # 用于计算循环三层列表是否在 首层 # 进入菜单循环 while True: print("欢迎光临旅游之城".center(38, "-")) # 循环打印菜单列表 for i in current_menu_dic: print(i) # 判断菜单列表是否在 首层 if count == 1: user_change = input("请选择城市名称; 输入q退出:").strip() # 菜单在首层,不打印返回b else: user_change = input("请选择城市名称; 输入q退出; 输入b返回上一级:").strip() # 判断用户选择的是否在菜单列表中 if user_change in current_menu_dic: if len(current_menu_dic[user_change]) > 0: # 判断菜单字典的 key值 有无value,无value说明到底层了 temp_menu_list.insert(0, current_menu_dic) # 将当前的菜单字典,加入到临时菜单列表,用于返回菜单使用 current_menu_dic = current_menu_dic[user_change] # 将用户选择后的菜单字典赋值给当前的菜单字典 count += 1 else: print("\033[31m已经是最底层了!\033[0m") # 当前菜单字典的key值 无value 就打印已经是底层了 # 当用户已经到达首层,还在输入b返回上一级,就告诉用户这已经是首层了 elif user_change == "b" and count == 1: print("\033[31m已经是最首层了!\033[0m") # 当用户输入b 返回上一级菜单 elif user_change == "b": current_menu_dic = temp_menu_list[0] # 将上一级菜单字典 赋值给当前菜单字典,作为新的菜单 temp_menu_list.pop(0) # 在临时菜单列表中删除上一次循环change后的当前菜单字典 count -= 1 elif user_change == "q": print("谢谢光临旅游之城".center(38, "*")) exit() else: print("\033[31m输入错误 请重新输入!\033[0m")