作业二:多级菜单

(1)三级菜单

(2)可以次选择进入各子菜单

(3)所需新知识点:列表、字典

要求:输入back返回上一层,输入quit退出整个程序

本示例的三级菜单是一个yaml文件格式,格式如下:

香港:
香港
澳门:
澳门
台湾:
台湾
钓鱼岛:
钓鱼岛
北京市:
- 市辖区
- 东城区
- 西城区
- 崇文区
- 宣武区
- 朝阳区
河北省:
- 石家庄市:
- 长安区
- 桥东区
- 桥西区
- 新华区
- 唐山市:
- 路南区
- 路北区
- 古冶区
- 开平区
- 秦皇岛市:
- 海港区
- 山海关区
山西省:
- 太原市:
- 小店区
- 迎泽区
- 杏花岭区
- 大同市:
- 城 区
- 矿 区
- 南郊区
- 阳泉市:
- 城 区
- 矿 区
- 郊 区
- 平定县
- 盂 县
- 长治市:
- 城 区
- 郊 区
- 长治县
- 襄垣县
- 屯留县

yaml格式的处理方法如下:

首先,上面的格式是一个多级模式,有一级,二级,三级的情况,使用yaml处理后的字典如下形式:

处理yaml的代码:

import yaml,collections
with open("","r") as f:
dic = yaml.load(f)
print(dic)

运行得到的字典如下格式:

{'香港': '香港',

    '北京市': ['市辖区', '东城区', '西城区', '崇文区', '宣武区', '朝阳区'],

    '台湾': '台湾',

    '澳门': '澳门',

   '河北省': [{'石家庄市': ['长安区', '桥东区', '桥西区', '新华区']}, {'唐山市': ['路南区', '路北区', '古冶区', '开平区']}, {'秦皇岛市': ['海港区', '山海关区']}],

    '钓鱼岛': '钓鱼岛',

    '山西省': [{'太原市': ['小店区', '迎泽区', '杏花岭区']}, {'大同市': ['城 区', '矿 区', '南郊区']}, {'阳泉市': ['城 区', '矿 区', '郊 区', '平定县', '盂 县']}, {'长治市': ['城 区', '郊 区', '长治县', '襄垣县', '屯留县']}]}

得到的是字典,一级如,"香港":"香港",值是字符串类型;二级如: '北京市': ['市辖区', '东城区', '西城区', '崇文区', '宣武区', '朝阳区'],值是列表形式,里面嵌套的是字符串;最复杂的是三级模式,如:'河北省': [{'石家庄市': ['长安区', '桥东区', '桥西区', '新华区']}, {'唐山市': ['路南区', '路北区', '古冶区', '开平区']}, {'秦皇岛市': ['海港区', '山海关区']}],里面第二层是列表,列表里面嵌套的还是字典。

思路:

(1)本项目的核心其实是得到省/市/县这样的模式,在处理的过程中,我们根据值对应的类型进行判断,使用那种方式处理比较好;

(2)首先我们遍历字典的第一层,得到省份,把省份放在一个字典中,这样,我们就可以根据用户输入的值的情况去进行输出对应的省;

  (3)得到省之后,我们可以得到省下面的键值,判断值对应的类型,根据不同值的类型进行不同方式的操作;

(4)如果值是字符串,说明是一级菜单形式,这种方式最好处理;

  (5)如果值是列表,且第一个值是字符串,说明是北京这种的二级模式,使用二级模式的方法进行展示;

  (6)如果值是列表,且第一个值是一个字典的形式,说明是三级模式的情形,就要使用三级模式来进行操作;

(7)定义全局变量,我们要知道我们需要得到的是什么,我们要得到省市县三级模式;只有知道了对应的省市县,我们只需要去字典中遍历即可得到值的信息。

流程图如下:

代码如下:

 import sys,yaml,os
def numeric(s):
"""判断用户输入是否为数字行字符串,并进行转换"""
if str.isdigit(s):
s = int(s)
return s def province_show(dic_db):
"""处理省份的模块"""
global P_NAME #定义全局变量,这个在程序中很重要,让我们在程序的运行过程中牢牢掌握我们需要的参数是什么
global C_NAME #定义全局变量
province_dict = {} #用来存储省信息的字典,以便用户输入的时候从中选择展示
for num,province_name in enumerate(dic_db.keys(),):
'''展示模块,展示系统中的省份'''
province_dict[num] = province_name #添加到字典中,形成编号和省份组合的字典
print("%d. %s" %(num,province_name) + "\t",end="")
'''\t是制表符,用来进行分割,end是让程序不要换行,因为我们知道,print()语句最后一句会有一个换行符'''
if num % == :
print()
print("\n==============================================================")
print("q:Exit")
'''第一层省份,没有退回第一层的操作'''
find_index = input("请输入你要查询的省的编号/名字:") #输入编号
find_index = numeric(find_index)
if find_index == "q":
sys.exit() #退出整个程序
if find_index in province_dict.values():
P_NAME = find_index #省的名称
show(P_NAME) #展示省的信息
elif find_index in province_dict.keys():
P_NAME = province_dict[find_index]
show(P_NAME)
else:
print("对不起,您输入的编号/省份不对,请重新输入!") return P_NAME #省的函数运行完成之后,返回省的名称,以便后续使用,因为主要是得到省/市/县 def judge(name,dic_db): #判断省下面的情况,由于省下面有些是1级菜单,二级菜单,三级菜单,根据值的类型不同,进行判断
"""判断省下面是几级菜单,香港只有一级,北京二级,山西三级"""
city_name = dic_db[name]
if type(city_name) == str: #一级菜单的值是一个字符串
return
elif type(city_name) == list: #二级菜单的值是一个列表
if type(city_name[]) == str:
'''只有两级查询'''
city_show(name,city_name) #根据值的不同,调用不同的处理函数
elif type(city_name[]) == dict: #三级菜单的值是一个字典
'''三级模块'''
country_show(name,city_name) #调用三级处理函数 def city_show(province,city_list): #传入省的名字和城市列表
global C_NAME #定义全局变量,用作市,省对应下面的市
'''二级处理模块'''
city_dict = {} #处理二级城市字典,用来遍历用户输入的情况
for city_num,city_name in enumerate(city_list,): #把省对应的所有市放到一个字典中,用户输入的时候方便输出对应的值
city_dict[city_num] = city_name
print("%d.%s" %(city_num,city_name) + "\t",end='')
if city_num % == :
print()
print("\n==================================================================")
print("q:Exit b:退回上一层")
#在函数中,结束函数的方法是return,我们在函数中可以定义循环,break结束当前循环,遇到retrun退出当前函数
city_index = input("请输入您要查询的市的编号/名字:")
city_index = numeric(city_index)
if city_index == "q":
sys.exit()
if city_index == "b":
return
elif city_index in city_list:
C_NAME = city_index
show(province,C_NAME)
elif city_index in city_dict.keys():
C_NAME = city_dict[city_index]
show(province,C_NAME)
return
else:
print("您输入的市的编号/名字不对,请核对后重新输入!") def country_show(province,country_list):
'''处理三级模块[{}]'''
global C_NAME
global C_INDEX
city_dict = {}
for c_num,c_name in enumerate(country_list,):
for key in c_name.keys():
city_dict[c_num] = key
for k,v in city_dict.items():
#遍历字典中的市名字和编号
print("%d.%s" %(k,v) + "\t",end='')
if k % == :
print()
print("\n===============================================================================")
print("q:Exit b:退回上一层")
while True:
city_num = input("请输入您要查询的市的编号/名字:")
city_num = numeric(city_num)
if city_num == 'q':
sys.exit()
if city_num == "b":
return
elif city_num in city_dict.values(): #字典的键和值
C_NAME = city_num
for key,value in city_dict.items():
if value == C_NAME:
C_INDEX = key
else:
pass
show(province,C_NAME)
elif city_num in city_dict.keys():
C_NAME = city_dict[city_num]
C_INDEX =city_num
show(province,C_NAME)
else:
print("您输入的市的编号/名字不对,请核对后重新输入!")
return
while True:
countries = country_list[C_INDEX - ][C_NAME]
for c_index,country in enumerate(countries,):
print("%d.%s" %(c_index,country) + "\t",end='')
if k % == :
print()
print("\n===============================================================================")
print("q:Exit b:退回上一层")
country_index = input("请输入你要查询的县(区)编号/名字:")
country_index = numeric(country_index)
if country_index == "q":
sys.exit()
if country_index == "b":
break
elif country_index in countries:
show(province,C_NAME,country_index)
elif country_index in range(,len(countries)+):
show(province,C_NAME,countries[country_index-])
else:
print("您输入的市(区)编号/名字有误,请核对后重新输入!") def framework(province='',city='',country=''):
"""系统展示模块,展示系统功能"""
os.system("clear") #清屏
message = '''
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \[;1m欢迎来到全国省市查询系统\[0m +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *************************************************************************** 省 份:%s 市(区):%s 县(区):%s ***************************************************************************
'''
print(message %(province,city,country)) def show(province_name="",city_name="",country_name=""):
output = '''\033[32;1m
---------------------------------------------------------------------------- 美丽的%s %s %s 欢迎您! 这里山美,水美,姑娘更美 ----------------------------------------------------------------------------
\[0m'''
print(output %(province_name,city_name,country_name)) if __name__ == "__main__":
with open("","r") as f: #打开文件
dic_db = yaml.load(f) #得到数据库字典
framework()
while True:
ProvinceName = province_show(dic_db)
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作业二:多级菜单操作(函数实现)的更多相关文章

  1. Python作业之多级菜单

    作业之多级菜单 菜单实现要求: 1. 列出菜单选择供选择 2. 选择对应内容进入下一级菜单 3. 任何时候都可以选择退出程序或返回上一级菜单 具体代码如下: goods = {'华为':{'A系':{ ...

  2. day1作业二:多级菜单操作

    作业二:多级菜单 (1)三级菜单 (2)可以次选择进入各子菜单 (3)所需新知识点:列表.字典 要求:输入back返回上一层,输入quit退出整个程序 思路: (1)首先定义好三级菜单字典: (2)提 ...

  3. day1 作业二:多级菜单操作

    作业二:多级菜单 (1)三级菜单 (2)可以次选择进入各子菜单 (3)所需新知识点:列表.字典 要求:输入b返回上一层,输入q退出整个程序 思路:三级菜单第一级别是省,第二级别是市,第三级别是县,用户 ...

  4. day1作业二:多级菜单

        作业二:多级菜单 1.三级菜单 2.可以次选择进入各子菜单 3.所需新知识点:列表.字典 4.打印b回到上一层 5.打印q退出循环 流程图如下: readme: (1)存储三级菜单的字典;设置 ...

  5. django权限二(多级菜单的设计以及展示)

    多级权限菜单设计级标题栏 我们现在只有数据展示,要进入其他url还需要手动的输入路径,非常的麻烦,所以我们要设计 一个导航栏以及侧边多级菜单栏,这个展示是通过stark组件的设计的增删改查页面,而 每 ...

  6. 老男孩python学习之作业二---三级菜单

    因为之前花力气完成了购物小程序的作业 现在做这个三级菜单简直是so easy!! 1.显示省级菜单 2.交互,提示用户输入要查看的省份(退出e) 2.1.用户正确输入列表中的省份 3.显示市级菜单 3 ...

  7. 作业二:构建swap函数

    一.swap代码 #include<stdio.h> int main() //主函数部分 { void swap(int *m,int *n); int a,b; int *p1,*p2 ...

  8. 原生JS封装创建多级菜单函数

    手写一个使用原生JS封装的多级菜单的函数,满足以下几点需求. 子类层级不确定,可根据数据自动生成多级菜单. 操作便捷,只需传入一个HTML标签. 缺点: 需要满足特定的数据结构 废话不多说,展示代码. ...

  9. s12-day01-work02 python多级菜单展示

    README # README.md # day001-work-2 @南非波波 功能实现:多级菜单展示 流程图: ![](http://i.imgur.com/VTPPhZU.jpg) 程序实现: ...

随机推荐

  1. Windows下php,mysql,apache相关安装与配置,完善中…

    PHP 的安装 由于php是一个zip文件(非install版),安装较为简单解压就行.把解压的 php5.2.1-Win32重命名为 php5.并复制到安装盘目录下.例如安装路径为 c:\php5 ...

  2. 快速搭建Spring Boot项目

    Spring boot是Spring推出的一个轻量化web框架,主要解决了Spring对于小型项目饱受诟病的配置和开发速度问题. Spring Boot 包含的特性如下: 创建可以独立运行的 Spri ...

  3. negativeView 的使用

    参考链接:http://blog.csdn.net/u012702547/article/details/51253222 1.一般来讲,是配合drawerLayout使用的,在xml文件中声明,其中 ...

  4. What Does “Neurons that Fire Together Wire Together” Mean?

    What Does “Neurons that Fire Together Wire Together” Mean? I’ve heard the phrase “neurons that fire ...

  5. Linux_用户管理&权限管理

    2017年1月11日, 星期三 Linux_用户管理&权限管理 1.  Linux用户管理&权限管理 终端的概念: tty  查看登录的终端 类型  user group    oth ...

  6. Java并发编程原理与实战八:产生线程安全性问题原因(javap字节码分析)

    前面我们说到多线程带来的风险,其中一个很重要的就是安全性,因为其重要性因此,放到本章来进行讲解,那么线程安全性问题产生的原因,我们这节将从底层字节码来进行分析. 一.问题引出 先看一段代码 packa ...

  7. mysql sql优化实例1(force index使用)

    今天和运维同学一块查找mysql慢查询日志,发现了如下一条sql: SELECT sum(`android` + ios) total,pictureid,title,add_time FROM `j ...

  8. vue_表单_组件

    表单.组件 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit ...

  9. 2016.5.57—— Remove Duplicates from Sorted List

    Remove Duplicates from Sorted List 本题收获: 指针: 不管什么指针在定义是就初始化:ListNode *head = NULL; 如果给head指针赋值为第一个no ...

  10. 【codeforces】【比赛题解】#931 CF Round #468 (Div. 2)

    因为太迟了,所以没去打. 后面打了Virtual Contest,没想到拿了个rank 3,如果E题更快还能再高,也是没什么想法. [A]Friends Meeting 题意: 在数轴上有两个整点\( ...