这个三级菜单费了很长时间,写起来很吃力,在老师讲之前,思路都错了,使用了字典套字典然后再套字典的方式,所以获取最里层的元素就很困难,一直被困在这里。听了老师的课,按照老师的思路,主要是数据的存储结构,然后自己写了控制逻辑。本来打算放弃了,因为很多同学都看视频教程都看到后面去了,自己很着急。但是我还是坚持了下来,最终完成了这个三级菜单的功能。值得自豪一下,自己完成了,I got it。下面将我的代码附上来。
首先是func.py部分的代码:
1 #!/usr/bin/env python 2 #-*-coding:utf-8-*- 3 #Created on 2016-6-19下午9:49:56 4 #author: Administrator 5 6 #定义省份列表 7 def get_province_list(): 8 pro_list = ( 9 {'pid':'1','pname':'四川省'}, 10 {'pid':'2','pname':'云南省'}, 11 {'pid':'3','pname':'河北省'}, 12 {'pid':'4','pname':'山西省'}, 13 {'pid':'5','pname':'辽宁省'}, 14 ) 15 return pro_list 16 17 18 #定义城市列表函数 19 def get_city_list(): 20 city_list =( 21 ({'cid':'1-1','cname':'成都市'},{'cid':'1-2','cname':'自贡市'},{'cid':'1-3','cname':'攀枝花市'},{'cid':'1-4','cname':'泸州市'},{'cid':'1-5','cname':'德阳市'},), 22 ({'cid':'2-1','cname':'昆明市'},{'cid':'2-2','cname':'曲靖市'},{'cid':'2-3','cname':'玉溪市'},{'cid':'2-4','cname':'保山市'},{'cid':'2-5','cname':'昭通市'},), 23 ({'cid':'3-1','cname':'石家庄市'},{'cid':'3-2','cname':'唐山市'},{'cid':'3-3','cname':'秦皇岛市'},{'cid':'3-4','cname':'邯郸市'},{'cid':'3-5','cname':'邢台市'},), 24 ({'cid':'4-1','cname':'太原市'},{'cid':'4-2','cname':'大同市'},{'cid':'4-3','cname':'阳泉市'},{'cid':'4-4','cname':'长治市'},{'cid':'4-5','cname':'晋城市'},{'cid':'4-6','cname':'朔州市'},), 25 ({'cid':'5-1','cname':'沈阳市'},{'cid':'5-2','cname':'大连市'},{'cid':'5-3','cname':'鞍山市'},{'cid':'5-4','cname':'抚顺市'},{'cid':'5-5','cname':'本溪市'},), 26 ) 27 return city_list 28 29 #定义区域列表 30 def get_area_list(): 31 area_list = ( 32 ({'aid':'1-1-1','aname':'市辖区'},{'aid':'1-1-2','aname':'锦江区'},{'aid':'1-1-3','aname':'青羊区'},{'aid':'1-1-4','aname':'金牛区'},{'aid':'1-1-5','aname':'武侯区'}), 33 ({'aid':'1-2-1','aname':'市辖区'},{'aid':'1-2-2','aname':'自流井区'},{'aid':'1-2-3','aname':'贡井区'},{'aid':'1-2-4','aname':'大安区'},{'aid':'1-2-5','aname':'沿滩区'}), 34 ({'aid':'1-3-1','aname':'市辖区'},{'aid':'1-3-2','aname':'东区'},{'aid':'1-3-3','aname':'西区'},{'aid':'1-3-4','aname':'仁和区'},{'aid':'1-3-5','aname':'米易县'},{'aid':'1-3-6','aname':'盐边县'}), 35 ({'aid':'1-4-1','aname':'市辖区'},{'aid':'1-4-2','aname':'江阳区'},{'aid':'1-4-3','aname':'纳溪区'},{'aid':'1-4-4','aname':'龙马潭区'}), 36 ({'aid':'1-5-1','aname':'市辖区'},{'aid':'1-5-2','aname':'旌阳区'},{'aid':'1-5-3','aname':'中江县'},{'aid':'1-5-4','aname':'罗江县'}), 37 ({'aid':'2-1-1','aname':'市辖区'},{'aid':'2-1-2','aname':'五华区'},{'aid':'2-1-3','aname':'盘龙区'},{'aid':'2-1-4','aname':'官渡区'},{'aid':'2-1-5','aname':'西山区'}), 38 ({'aid':'2-2-1','aname':'市辖区'},{'aid':'2-2-2','aname':'麒麟区'},{'aid':'2-2-3','aname':'马龙区'},{'aid':'2-2-4','aname':'陆良区'},{'aid':'2-2-5','aname':'师宗区'}), 39 ({'aid':'2-3-1','aname':'市辖区'},{'aid':'2-3-2','aname':'红塔区'},{'aid':'2-3-3','aname':'江川县'},{'aid':'2-3-4','aname':'澄江县'},{'aid':'2-3-5','aname':'通海县'}), 40 ({'aid':'2-4-1','aname':'市辖区'},{'aid':'2-4-2','aname':'隆阳区'},{'aid':'2-4-3','aname':'施甸县'},{'aid':'2-4-4','aname':'腾冲县'},{'aid':'2-4-5','aname':'龙陵县'}), 41 ({'aid':'2-5-1','aname':'市辖区'},{'aid':'2-5-2','aname':'昭阳区'},{'aid':'2-5-3','aname':'鲁甸县'},{'aid':'2-5-4','aname':'巧家县'},{'aid':'2-5-5','aname':'盐津县'}), 42 ({'aid':'3-1-1','aname':'市辖区'},{'aid':'3-1-2','aname':'长安区'},{'aid':'3-1-3','aname':'桥东区'},{'aid':'3-1-4','aname':'桥西区'},{'aid':'3-1-5','aname':'新华区'}), 43 ({'aid':'3-2-1','aname':'市辖区'},{'aid':'3-2-2','aname':'路南区'},{'aid':'3-2-3','aname':'路北区'},{'aid':'3-2-4','aname':'古冶区'},{'aid':'3-2-5','aname':'开平区'}), 44 ({'aid':'3-3-1','aname':'市辖区'},{'aid':'3-3-2','aname':'海港区'},{'aid':'3-3-3','aname':'山海关区'},{'aid':'3-3-4','aname':'北戴河区'},{'aid':'3-3-5','aname':'昌黎县'}), 45 ({'aid':'3-4-1','aname':'市辖区'},{'aid':'3-4-2','aname':'邯山区'},{'aid':'3-4-3','aname':'丛台区'},{'aid':'3-4-4','aname':'复兴区'},{'aid':'3-4-5','aname':'邯郸县'}), 46 ({'aid':'3-5-1','aname':'市辖区'},{'aid':'3-5-2','aname':'桥东区'},{'aid':'3-5-3','aname':'桥西区'},{'aid':'3-5-4','aname':'邢台县'},{'aid':'3-5-5','aname':'临城县'}), 47 ({'aid':'4-1-1','aname':'市辖区'},{'aid':'4-1-2','aname':'小店区'},{'aid':'4-1-3','aname':'迎泽区'},{'aid':'4-1-4','aname':'杏花岭区'},{'aid':'4-1-5','aname':'尖草坪区'}), 48 ({'aid':'4-2-1','aname':'市辖区'},{'aid':'4-2-2','aname':'城区'},{'aid':'4-2-3','aname':'矿区'},{'aid':'4-2-4','aname':'南郊区'},{'aid':'4-2-5','aname':'新荣区'}), 49 ({'aid':'4-3-1','aname':'市辖区'},{'aid':'4-3-2','aname':'城区'},{'aid':'4-3-3','aname':'矿区'},{'aid':'4-3-4','aname':'郊区'},{'aid':'4-3-5','aname':'平定县'}), 50 ({'aid':'4-4-1','aname':'市辖区'},{'aid':'4-4-2','aname':'城区'},{'aid':'4-4-3','aname':'郊区'},{'aid':'4-4-4','aname':'长治县'},{'aid':'4-4-5','aname':'襄垣县'}), 51 ({'aid':'4-5-1','aname':'市辖区'},{'aid':'4-5-2','aname':'城区'},{'aid':'4-5-3','aname':'沁水县'},{'aid':'4-5-4','aname':'阳城县'},{'aid':'4-5-5','aname':'陵川县'}), 52 ({'aid':'4-6-1','aname':'市辖区'},{'aid':'4-6-2','aname':'朔城区'},{'aid':'4-6-3','aname':'平鲁区'},{'aid':'4-6-4','aname':'山阴县'},{'aid':'4-6-5','aname':'应县'}), 53 ({'aid':'5-1-1','aname':'市辖区'},{'aid':'5-1-2','aname':'和平区'},{'aid':'5-1-3','aname':'沈河区'},{'aid':'5-1-4','aname':'大东区'},{'aid':'5-1-5','aname':'皇姑区'}), 54 ({'aid':'5-2-1','aname':'市辖区'},{'aid':'5-2-2','aname':'中山区'},{'aid':'5-2-3','aname':'西岗区'},{'aid':'5-2-4','aname':'沙河口区'},{'aid':'5-2-5','aname':'甘井子区'}), 55 ({'aid':'5-3-1','aname':'市辖区'},{'aid':'5-3-2','aname':'铁东区'},{'aid':'5-3-3','aname':'铁西区'},{'aid':'5-3-4','aname':'立山区'},{'aid':'5-3-5','aname':'千山区'}), 56 ({'aid':'5-4-1','aname':'市辖区'},{'aid':'5-4-2','aname':'新抚区'},{'aid':'5-4-3','aname':'东洲区'},{'aid':'5-4-4','aname':'望花区'},{'aid':'5-4-5','aname':'顺城区'}), 57 ({'aid':'5-5-1','aname':'市辖区'},{'aid':'5-5-2','aname':'平山区'},{'aid':'5-5-3','aname':'溪湖区'},{'aid':'5-5-4','aname':'明山区'},{'aid':'5-5-5','aname':'南芬区'}), 58 ) 59 return area_list 60 61 def show_pro(): 62 pro_list = get_province_list() 63 for province in pro_list: #province是元组中的一个字典,因此具有key和value 64 print(province['pid'],province['pname']) 65 66 #判断选择的省份是否在已有省份中的函数 67 def is_choose_province_exsit(pid): 68 for pro_list in get_province_list(): 69 if pid == pro_list['pid']: 70 return True 71 return False 72 73 def is_choose_city_exsit(choose_pid,choose_cid): 74 for city_list in get_city_list(): 75 for city in city_list: 76 if choose_pid+'-'+ choose_cid == city['cid']: 77 return True 78 return False 79 80 #显示所选编号的省下对应的城市名称函数 81 def show_city(choosed_pid): 82 for city_list in get_city_list(): #ciyt_list为子元组 83 for city in city_list: #city为子元组里面的字典 84 pid,cid = city['cid'].split('-') #通过字符串的split()方法,将数据中的cid划分为省编号pid和城市编号cid 85 if pid == choosed_pid: #加上判断条件,打印对应序号下的省包含的城市名称 86 print(cid,city['cname']) 87 88 def show_area(choose_pid,choose_cid): 89 for area_list in get_area_list(): 90 for area in area_list: 91 pid,cid,aid = area['aid'].split('-') 92 if pid == choose_pid and cid == choose_cid: 93 print(aid,area['aname'])
接着上主程序部分代码:
1 #!/usr/bin/env python 2 #-*-coding:utf-8-*- 3 #Created on 2016-6-19下午7:37:31 4 #author: Administrator 5 6 from func import * 7 8 if __name__ == '__main__': 9 pro_flag = True #定义一个标识,用于控制程序是否退出 10 while pro_flag: #开始无限循环,判断输入,直到后面程序设置循环标识为False,退出程序 11 show_pro() 12 choose_pid = input('请输入省份编号:').strip() 13 if not choose_pid.isdigit(): 14 if choose_pid == 'exit': 15 pro_flag = False 16 else: 17 print('输入错误,请重新输入.') 18 continue 19 if is_choose_province_exsit(choose_pid): 20 city_flag = True 21 while city_flag: 22 show_city(choose_pid) 23 choose_cid = input('请输入城市编号:').strip() 24 if not choose_cid.isdigit(): #判断用户输入是否为数字,如果不为数字,看是否为quit或者exit中的一个,根据用户输入不同,进行不同操作 25 if choose_cid == 'quit': 26 break 27 elif choose_cid == 'exit': 28 pro_flag = False 29 break 30 else: 31 print('输入错误,请重新输入.') 32 continue 33 while is_choose_city_exsit(choose_pid,choose_cid): 34 show_area(choose_pid, choose_cid) 35 choose =input('返回上一级请输入"quit",直接退出请输入"exit"').strip() 36 if choose == 'quit': 37 break 38 elif choose == 'exit': 39 city_flag = False 40 pro_flag = False 41 break 42 else: 43 print('输入错误,请重新输入:') 44 else: 45 print('输入错误,请重新输入:') 46 continue 47 else: 48 print('输入错误,请重新输入.')
程序功能是实现了,但是与老师的代码比较起来,繁琐,不够简洁,效率肯定更加低下,还需要好好努力,多写,多看,多思考,一定会提高的。为自己加油!