day1作业二:多级菜单操作(函数实现)
Posted (野生程序员)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day1作业二:多级菜单操作(函数实现)相关的知识,希望对你有一定的参考价值。
作业二:多级菜单
(1)三级菜单
(2)可以次选择进入各子菜单
(3)所需新知识点:列表、字典
要求:输入back返回上一层,输入quit退出整个程序
本示例的三级菜单是一个yaml文件格式,格式如下:
香港: 香港 澳门: 澳门 台湾: 台湾 钓鱼岛: 钓鱼岛 北京市: - 市辖区 - 东城区 - 西城区 - 崇文区 - 宣武区 - 朝阳区 河北省: - 石家庄市: - 长安区 - 桥东区 - 桥西区 - 新华区 - 唐山市: - 路南区 - 路北区 - 古冶区 - 开平区 - 秦皇岛市: - 海港区 - 山海关区 山西省: - 太原市: - 小店区 - 迎泽区 - 杏花岭区 - 大同市: - 城 区 - 矿 区 - 南郊区 - 阳泉市: - 城 区 - 矿 区 - 郊 区 - 平定县 - 盂 县 - 长治市: - 城 区 - 郊 区 - 长治县 - 襄垣县 - 屯留县
yaml格式的处理方法如下:
首先,上面的格式是一个多级模式,有一级,二级,三级的情况,使用yaml处理后的字典如下形式:
处理yaml的代码:
import yaml,collections with open("222","r") as f: dic = yaml.load(f) print(dic)
运行得到的字典如下格式:
{\'香港\': \'香港\',
\'北京市\': [\'市辖区\', \'东城区\', \'西城区\', \'崇文区\', \'宣武区\', \'朝阳区\'],
\'台湾\': \'台湾\',
\'澳门\': \'澳门\',
\'河北省\': [{\'石家庄市\': [\'长安区\', \'桥东区\', \'桥西区\', \'新华区\']}, {\'唐山市\': [\'路南区\', \'路北区\', \'古冶区\', \'开平区\']}, {\'秦皇岛市\': [\'海港区\', \'山海关区\']}],
\'钓鱼岛\': \'钓鱼岛\',
\'山西省\': [{\'太原市\': [\'小店区\', \'迎泽区\', \'杏花岭区\']}, {\'大同市\': [\'城 区\', \'矿 区\', \'南郊区\']}, {\'阳泉市\': [\'城 区\', \'矿 区\', \'郊 区\', \'平定县\', \'盂 县\']}, {\'长治市\': [\'城 区\', \'郊 区\', \'长治县\', \'襄垣县\', \'屯留县\']}]}
得到的是字典,一级如,"香港":"香港",值是字符串类型;二级如: \'北京市\': [\'市辖区\', \'东城区\', \'西城区\', \'崇文区\', \'宣武区\', \'朝阳区\'],值是列表形式,里面嵌套的是字符串;最复杂的是三级模式,如:\'河北省\': [{\'石家庄市\': [\'长安区\', \'桥东区\', \'桥西区\', \'新华区\']}, {\'唐山市\': [\'路南区\', \'路北区\', \'古冶区\', \'开平区\']}, {\'秦皇岛市\': [\'海港区\', \'山海关区\']}],里面第二层是列表,列表里面嵌套的还是字典。
思路:
(1)本项目的核心其实是得到省/市/县这样的模式,在处理的过程中,我们根据值对应的类型进行判断,使用那种方式处理比较好;
(2)首先我们遍历字典的第一层,得到省份,把省份放在一个字典中,这样,我们就可以根据用户输入的值的情况去进行输出对应的省;
(3)得到省之后,我们可以得到省下面的键值,判断值对应的类型,根据不同值的类型进行不同方式的操作;
(4)如果值是字符串,说明是一级菜单形式,这种方式最好处理;
(5)如果值是列表,且第一个值是字符串,说明是北京这种的二级模式,使用二级模式的方法进行展示;
(6)如果值是列表,且第一个值是一个字典的形式,说明是三级模式的情形,就要使用三级模式来进行操作;
(7)定义全局变量,我们要知道我们需要得到的是什么,我们要得到省市县三级模式;只有知道了对应的省市县,我们只需要去字典中遍历即可得到值的信息。
流程图如下:
代码如下:
1 import sys,yaml,os 2 def numeric(s): 3 """判断用户输入是否为数字行字符串,并进行转换""" 4 if str.isdigit(s): 5 s = int(s) 6 return s 7 8 def province_show(dic_db): 9 """处理省份的模块""" 10 global P_NAME #定义全局变量,这个在程序中很重要,让我们在程序的运行过程中牢牢掌握我们需要的参数是什么 11 global C_NAME #定义全局变量 12 province_dict = {} #用来存储省信息的字典,以便用户输入的时候从中选择展示 13 for num,province_name in enumerate(dic_db.keys(),1): 14 \'\'\'展示模块,展示系统中的省份\'\'\' 15 province_dict[num] = province_name #添加到字典中,形成编号和省份组合的字典 16 print("%d. %s" %(num,province_name) + "\\t",end="") 17 \'\'\'\\t是制表符,用来进行分割,end是让程序不要换行,因为我们知道,print()语句最后一句会有一个换行符\'\'\' 18 if num % 4 == 0: 19 print() 20 print("\\n==============================================================") 21 print("q:Exit") 22 \'\'\'第一层省份,没有退回第一层的操作\'\'\' 23 find_index = input("请输入你要查询的省的编号/名字:") #输入编号 24 find_index = numeric(find_index) 25 if find_index == "q": 26 sys.exit(0) #退出整个程序 27 if find_index in province_dict.values(): 28 P_NAME = find_index #省的名称 29 show(P_NAME) #展示省的信息 30 elif find_index in province_dict.keys(): 31 P_NAME = province_dict[find_index] 32 show(P_NAME) 33 else: 34 print("对不起,您输入的编号/省份不对,请重新输入!") 35 36 return P_NAME #省的函数运行完成之后,返回省的名称,以便后续使用,因为主要是得到省/市/县 37 38 def judge(name,dic_db): #判断省下面的情况,由于省下面有些是1级菜单,二级菜单,三级菜单,根据值的类型不同,进行判断 39 """判断省下面是几级菜单,香港只有一级,北京二级,山西三级""" 40 city_name = dic_db[name] 41 if type(city_name) == str: #一级菜单的值是一个字符串 42 return 43 elif type(city_name) == list: #二级菜单的值是一个列表 44 if type(city_name[0]) == str: 45 \'\'\'只有两级查询\'\'\' 46 city_show(name,city_name) #根据值的不同,调用不同的处理函数 47 elif type(city_name[0]) == dict: #三级菜单的值是一个字典 48 \'\'\'三级模块\'\'\' 49 country_show(name,city_name) #调用三级处理函数 50 51 def city_show(province,city_list): #传入省的名字和城市列表 52 global C_NAME #定义全局变量,用作市,省对应下面的市 53 \'\'\'二级处理模块\'\'\' 54 city_dict = {} #处理二级城市字典,用来遍历用户输入的情况 55 for city_num,city_name in enumerate(city_list,1): #把省对应的所有市放到一个字典中,用户输入的时候方便输出对应的值 56 city_dict[city_num] = city_name 57 print("%d.%s" %(city_num,city_name) + "\\t",end=\'\') 58 if city_num % 4 == 0: 59 print() 60 print("\\n==================================================================") 61 print("q:Exit b:退回上一层") 62 #在函数中,结束函数的方法是return,我们在函数中可以定义循环,break结束当前循环,遇到retrun退出当前函数 63 city_index = input("请输入您要查询的市的编号/名字:") 64 city_index = numeric(city_index) 65 if city_index == "q": 66 sys.exit() 67 if city_index == "b": 68 return 69 elif city_index in city_list: 70 C_NAME = city_index 71 show(province,C_NAME) 72 elif city_index in city_dict.keys(): 73 C_NAME = city_dict[city_index] 74 show(province,C_NAME) 75 return 76 else: 77 print("您输入的市的编号/名字不对,请核对后重新输入!") 78 79 def country_show(province,country_list): 80 \'\'\'处理三级模块[{}]\'\'\' 81 global C_NAME 82 global C_INDEX 83 city_dict = {} 84 for c_num,c_name in enumerate(country_list,1): 85 for key in c_name.keys(): 86 city_dict[c_num] = key 87 for k,v in city_dict.items(): 88 #遍历字典中的市名字和编号 89 print("%d.%s" %(k,v) + "\\t",end=\'\') 90 if k % 4 == 0: 91 print() 92 print("\\n===============================================================================") 93 print("q:Exit b:退回上一层") 94 while True: 95 city_num = input("请输入您要查询的市的编号/名字:") 96 city_num = numeric(city_num) 97 if city_num == \'q\': 98 sys.exit() 99 if city_num == "b": 100 return 101 elif city_num in city_dict.values(): #字典的键和值 102 C_NAME = city_num 103 for key,value in city_dict.items(): 104 if value == C_NAME: 105 C_INDEX = key 106 else: 107 pass 108 show(province,C_NAME) 109 elif city_num in city_dict.keys(): 110 C_NAME = city_dict[city_num] 111 C_INDEX =city_num 112 show(province,C_NAME) 113 else: 114 print("您输入的市的编号/名字不对,请核对后重新输入!") 115 return 116 while True: 117 countries = country_list[C_INDEX - 1][C_NAME] 118 for c_index,country in enumerate(countries,1): 119 print("%d.%s" %(c_index,country) + "\\t",end=\'\') 120 if k % 4 == 0: 121 print() 122 print("\\n===============================================================================") 123 print("q:Exit b:退回上一层") 124 country_index = input("请输入你要查询的县(区)编号/名字:") 125 country_index = numeric(country_index) 126 if country_index == "q": 127 sys.exit() 128 if country_index == "b": 129 break 130 elif country_index in countries: 131 show(province,C_NAME,country_index) 132 elif country_index in range(1,len(countries)+1): 133 show(province,C_NAME,countries[country_index-1]) 134 else: 135 print("您输入的市(区)编号/名字有误,请核对后重新输入!") 136 137 def framework(province=\'\',city=\'\',country=\'\'): 138 """系统展示模块,展示系统功能""" 139 os.system("clear") #清屏 140 message = \'\'\' 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 142 143 \\033[32;1m欢迎来到全国省市查询系统\\033[0m 144 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 146 147 *************************************************************************** 148 149 省 份:%s 150 151 市(区):%s 152 153 县(区):%s 154 155 *************************************************************************** 156 \'\'\' 157 print(message %(province,city,country)) 158 159 def show(province_name="",city_name="",country_name=""): 160 output = \'\'\'\\033[32;1m 161 ---------------------------------------------------------------------------- 162 163 美丽的%s %s %s 164 165 欢迎您! 166 167 这里山美,水美,姑娘更美 168 169 ---------------------------------------------------------------------------- 170 \\033[0m\'\'\' 171 print(output %(province_name,city_name,country_name)) 172 173 if __name__ == "__main__": 174 with open("222","r") as f: #打开文件 175 dic_db = yaml.load(f) #得到数据库字典 176 framework() 177 while True: 178 ProvinceName = province_show(dic_db) 179 judge(ProvinceName,dic_db)
代码运行如下:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
欢迎来到全国省市查询系统
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
***************************************************************************
省 份:
市(区):
县(区):
***************************************************************************
1. 澳门 2. 山西省 3. 北京市 4. 台湾
5. 钓鱼岛 6. 香港 7. 河北省
==============================================================
q:Exit
请输入你要查询的省的编号/名字:1
----------------------------------------------------------------------------
美丽的澳门
欢迎您!
这里山美,水美,姑娘更美
----------------------------------------------------------------------------
1. 澳门 2. 山西省 3. 北京市 4. 台湾
5. 钓鱼岛 6. 香港 7. 河北省
==============================================================
q:Exit
请输入你要查询的省的编号/名字:2
----------------------------------------------------------------------------
美丽的山西省
欢迎您!
这里山美,水美,姑娘更美
----------------------------------------------------------------------------
1.太原市 2.大同市 3.阳泉市 4.长治市
===============================================================================
q:Exit b:退回上一层
请输入您要查询的市的编号/名字:2
----------------------------------------------------------------------------
美丽的山西省 大同市
欢迎您!
这里山美,水美,姑娘更美
----------------------------------------------------------------------------
1.城 区
2.矿 区
3.南郊区
===============================================================================
q:Exit b:退回上一层
请输入你要查询的县(区)编号/名字:2
----------------------------------------------------------------------------
美丽的山西省 大同市 矿 区
欢迎您!
这里山美,水美,姑娘更美
----------------------------------------------------------------------------
1.城 区
2.矿 区
3.南郊区
===============================================================================
q:Exit b:退回上一层
请输入你要查询的县(区)编号/名字:b
请输入您要查询的市的编号/名字:b
1. 澳门 2. 山西省 3. 北京市 4. 台湾
5. 钓鱼岛 6. 香港 7. 河北省
==============================================================
q:Exit
请输入你要查询的省的编号/名字:北京市
----------------------------------------------------------------------------
美丽的北京市
欢迎您!
这里山美,水美,姑娘更美
----------------------------------------------------------------------------
1.市辖区
==================================================================
q:Exit b:退回上一层
请输入您要查询的市的编号/名字:1
----------------------------------------------------------------------------
美丽的北京市 市辖区
欢迎您!
这里山美,水美,姑娘更美
----------------------------------------------------------------------------
1. 澳门 2. 山西省 3. 北京市 4. 台湾
5. 钓鱼岛 6. 香港 7. 河北省
==============================================================
q:Exit
请输入你要查询的省的编号/名字:7
----------------------------------------------------------------------------
美丽的河北省
欢迎您!
这里山美,水美,姑娘更美
----------------------------------------------------------------------------
1.石家庄市 2.唐山市 3.秦皇岛市
===============================================================================
q:Exit b:退回上一层
请输入您要查询的市的编号/名字:石家庄市
----------------------------------------------------------------------------
美丽的河北省 石家庄市
欢迎您!
这里山美,水美,姑娘更美
----------------------------------------------------------------------------
1.长安区 2.桥东区 3.桥西区 4.新华区
===============================================================================
q:Exit b:退回上一层
请输入你要查询的县(区)编号/名字:长安区
----------------------------------------------------------------------------
美丽的河北省 石家庄市 长安区
欢迎您!
这里山美,水美,姑娘更美
----------------------------------------------------------------------------
1.长安区 2.桥东区 3.桥西区 4.新华区
===============================================================================
q:Exit b:退回上一层
请输入你要查询的县(区)编号/名字:q
上面代码,我学到了如下知识:
(1)yaml格式文件的处理,导入yaml模块,使用yaml.load()进行文件字符串转换为字典形式;
(2)全局变量的定义,在很多时候,在程序运行的过程中,我们总是需要的到几个重要的变量,使用全局变量,能够让我们更好的理清思路,全局变量使用global来进行定义;
(3)函数def的结束是遇到return,遇到return无论什么时候,就结束这个函数,因为当我们与while结合使用的时候,可以直接使用return来结束这个循环;
(4)字典、列表的处理方式;
(5)enumerate()函数的使用;
(6)sys.exit()来退出整个程序,sys模块;
(7)不怕麻烦,牢牢知道自己需要的是什么自己的目的是什么。
以上是关于day1作业二:多级菜单操作(函数实现)的主要内容,如果未能解决你的问题,请参考以下文章