需求:编写三级菜单
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")