作业二:多级菜单

(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. svn服务器搭建(windows)

    转载:https://blog.csdn.net/daobantutu/article/details/60467185 本教程会从最基本的下载安装到上传代码,下载代码这条线来详细讲述如何完成SVN服 ...

  2. 获取异常信息e.printStackTrace()的内容

    获取异常信息e.printStackTrace()的内容 最近做项目的时候需要记录操作的日志,但是记录异常信息的是发现使用e.getMessage()根本无法满足需要,并且e.getMessage() ...

  3. C/C++中的回调函数

    在理解“回调函数”之前,首先讨论下函数指针的概念. 函数指针 (1)概念:指针是一个变量,是用来指向内存地址的.一个程序运行时,所有和运行相关的物件都是需要加载到内存中,这就决定了程序运行时的任何物件 ...

  4. java selenium常用API(WebElement、iFrame、select、alert、浏览器窗口、事件、js) 一

     WebElement相关方法 1.点击操作 WebElement button = driver.findElement(By.id("login")); button.clic ...

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

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

  6. select标签的描述

    1.标签html与js如下代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...

  7. 20、List集合中特有的方法

    List里面的特有方法简介 List中除了Collection里面的方法以外,内部还有一些方法,通过这些方法,开发者可以更方便的操作List接口的实现类. package com.monkey1024 ...

  8. Python概念-Item系列(林海峰教的)

    这个Item系列是egon老师自创的,个人还是可以接受这种文化底蕴的,所以直接拿来用,也是毫无违和感的 所谓Attr系列,其实是__setattr__,__delattr__,__getattr__ ...

  9. webpack4.5.0+vue2.5.16+vue-loader 实战组件化开发案例以及版本问题中踩的一些大坑!!!

    一 vue-loader 我们先不管脚手架,只说vue-loader,简单讲就是可将.vue文件打包,实现组件化开发,即一个.vue文件就是一个组件,开发中只需要引入这个.vue组件就可以了! 然后. ...

  10. discuz过滤词语无效

    1.是由于一些特殊的字导致serialize序列化错误.过滤词语在表 common_word中,序列化房子common_syscache的censor中,看看是否有特殊符号.