1. 作业需求:
数据结构:
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'YouKu': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
}
需求:
可依次选择进入各子菜单
可从任意一层往回退到上一层
可从任意一层退出程序
所需新知识点:列表、字典
2. 流程图
3. Readme
功能:
1. 自定义数据,显示三级菜单信息
2. 在选择列表信息的同时,可以选择退出或者返回上一级
3. 如果在一级或二级菜单下面没有信息了,会有提示,然后返回之前的选择
代码语言
python3.6
版本
version 0.0.1
4. 代码
#!/usr/bin/env python3
# _*_coding:utf-8 _*_
# @author : zpfly
# @Time : 2018/3/16
# 地址三级菜单
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'YouKu': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
}
# 显示当前级别的可选地点
def show_list(dict_name):
region = []
for region_name in dict_name.keys():
region.append(region_name)
print(region)
return region
# 对于用户的选择进行判断
def choice_check(upper_dict):
# upper_dict参数是上一层区域的字典信息
choice = input("请输入要查看的区域(q退出,b返回上级):")
if choice == 'q':
# 退出
print("\033[1;31;m退出选择\033[0m")
exit(1)
elif choice == 'b':
# 返回上一级
return 1
elif choice in upper_dict:
# 如果输入
if len(upper_dict[choice]) == 0:
print("\033[1;31;m已经没有信息了,返回上一层\033[0m")
return 3
return upper_dict[choice]
else:
print("\033[1;31;m输入错误,请重新选择\033[0m")
return 2
# 查看省
while True:
region_list = show_list(menu)
result_1 = choice_check(menu)
if result_1 == 1:
print("\033[1;31;m已经是最顶层,请重新选择\033[0m")
continue
elif result_1 == 2:
continue
elif result_1 == 3:
continue
else:
# 查看市
while True:
region_list_2 = show_list(result_1)
result_2 = choice_check(result_1)
if result_2 == 1:
break
elif result_2 == 3 or result_2 == 2:
continue
else:
# 查看区
while True:
region_list_3 = show_list(result_2)
result_3 = choice_check(result_2)
if result_3 == 1:
break
elif result_3 == 3 or result_3 == 2:
continue
else:
region_list_4 = show_list(result_3)
print("\033[1;31;m当前已经是最后一级\033[0m")
result_4 = choice_check(result_3)
if result_4 == 2:
continue
5. 测试
测试1. 依次进入各子菜单
['北京', '上海', '山东']
请输入要查看的区域(q退出,b返回上级):北京 # 依次选择进入第一二三级菜单
['海淀', '昌平', '朝阳', '东城']
请输入要查看的区域(q退出,b返回上级):海淀
['五道口', '中关村', '上地']
请输入要查看的区域(q退出,b返回上级):五道口
['soho', '网易', 'google']
当前已经是最后一级 # 在最后一级有提示信息
请输入要查看的区域(q退出,b返回上级):soho # 在最后一级输入查询信息,会提示,然后返回到上级菜单
已经没有信息了,返回上一层
['五道口', '中关村', '上地']
请输入要查看的区域(q退出,b返回上级):上地
['百度']
当前已经是最后一级
请输入要查看的区域(q退出,b返回上级):百度
已经没有信息了,返回上一层
['五道口', '中关村', '上地']
请输入要查看的区域(q退出,b返回上级):q
退出选择
测试2:输入错误时
['北京', '上海', '山东']
请输入要查看的区域(q退出,b返回上级):beijing # 输入错误会提示,然后重新输入
输入错误,请重新选择
['北京', '上海', '山东']
请输入要查看的区域(q退出,b返回上级):北京 # b返回上一级
['海淀', '昌平', '朝阳', '东城']
请输入要查看的区域(q退出,b返回上级):b
['北京', '上海', '山东']
请输入要查看的区域(q退出,b返回上级):山东 # 菜单下面没有信息,会返回到上一层有信息的
已经没有信息了,返回上一层
['北京', '上海', '山东']
请输入要查看的区域(q退出,b返回上级):q
退出选择
不足之处与思考:
1. 可以从逻辑流程图很明显的看到,每个循环的流程都极其相似,那么是否可以把代码更加优化呢?
2. 如果进行代码的优化,但是考虑到每个层级出现有一些细微之处不同,而且只有三级菜单,是否有优化的必要呢?