第三课笔记

这一次还是以笔记来记录作业的情况。课程这两天还真抽不出时间来看。先完成作业吧。
作业需求为:

可依次选择进入各子菜单
可从任意一层往回退到上一层
可从任意一层退出程序
所需新知识点:列表、字典

代码为:

import sys
menu = {
'北京':{
'海淀':{
'五道口':{
'soho':{},
'网易':{},
'google':{}
},
'中关村':{
'爱奇艺':{},
'汽车之家':{},
'youku':{},
},
'上地':{
'百度':{},
},
},
'昌平':{
'沙河':{
'老男孩':{},
'北航':{},
},
'天通苑':{},
'回龙观':{},
},
'朝阳':{},
'东城':{},
},
'上海':{
'闵行':{
"人民广场":{
'炸鸡店':{}
}
},
'闸北':{
'火车战':{
'携程':{}
}
},
'浦东':{},
},
'山东':{},
}

def dict_num(args,*wargs,**kwargs):
menu_list=[]
for i in kwargs:
menu_list.append(i)
k = 0
menu_choice={}
while k < len(menu_list) :
menu_choice[k]=menu_list[k]
print (str(k)+':'+menu_list[k])
k+=1
return menu_choice

def main():
exit_flag = 0
while not exit_flag == 1:
menu_list=dict_num('',**menu)
choice1 = input("选择进入主菜单('q':退出 )>>:")
try:
menu_choice1=menu_list[int(choice1)]
if menu_choice1 in menu:
while not exit_flag == 1:
menu_list=dict_num('',**menu[menu_choice1])
choice2 = input("选择进入二级菜单('p':返回上一层;'q':退出 )>>:")
if choice2.isdigit():
try:
menu_choice2=menu_list[int(choice2)]
if menu_choice2 in menu[menu_choice1]:
while not exit_flag == 1:
menu_list=dict_num('',**menu[menu_choice1][menu_choice2])
choice3 = input("选择进入三级菜单('p':返回上一层;'q':退出 )>>:")
if choice3.isdigit():
try:
menu_choice3=menu_list[int(choice3)]
if menu_choice3 in menu[menu_choice1][menu_choice2]:
menu_list=dict_num('',**menu[menu_choice1][menu_choice2][menu_choice3])
choice4 = input("菜单已到最后一层,按p返回>>:")
if choice4 == "p":
pass
elif choice4 == "q":
exit_flag = 1
else:
pass
except:
pass
if choice3 == "p":
break
elif choice3 == "q":
exit_flag = 1
except:
pass
elif choice2 == "p":
break
elif choice2 == "q":
exit_flag = 1
else:
pass
except:
pass
if choice1 == "q":
exit_flag = 1

if __name__ == '__main__':
main()


这里逻辑看上去太过复杂。但是也没有时间去优化了。主要考虑的几点包括:
1、原有字典可以直接拿出来作为菜单选项选择,但是需要精确匹配输入才行,这有点反人性化了。考虑的是能否用到列表的下标来匹配具体选择的菜单选择,代替精确输入。
在多级菜单中均存在这个问题,所以提炼了共同的代码,作为一个公共函数调用。具体函数为dict_num,也就实现了同级菜单转化为一个列表,并显示的时候带上列表的索引号。
输入索引号后,再转化为具体的值带入字典中得到下级菜单的内容。
对于这个函数,需要注意的是传入参数为字典,返回参数为列表。注意函数的创建方式(dict_num(args,*wargs,**kwargs))和调用方式(dict_num('',**menu[menu_choice1]))
2、输入的判断:由于涉及了字典到列表的转换,输入考虑是采用数字,而且转换时会有一系列的处理,但是退出或返回时肯定是采用字母比较合适,所以字母输入也需要接受,因此一旦输入字母,需要做一些判断和进行一些列异常的考虑。否则就会因为类型不匹配而抛出错误。
3、退出循环,还是采用之前设置标记位的方式退出整个大的while循环。

猜你喜欢

转载自www.cnblogs.com/lsl031/p/9233081.html