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)不怕麻烦,牢牢知道自己需要的是什么自己的目的是什么。

 

posted @ 2017-06-07 05:52  (野生程序员)  阅读(418)  评论(0编辑  收藏  举报