我的Python成长之路---第一天---Python基础(作业2:三级菜单)---2015年12月26日(雾霾)
作业二:三级菜单
- 三级菜单
- 可一次进入各个子菜单
思路:
这个题看似不难,难点在于三层循环的嵌套,我的思路就是通过flag的真假来控制每一层的循环的,简单来说就是就是通过给每一层循环一个单独的布尔变量XXX_flag例如,程序已经进入了第三层循环,要返回第二层循环就是把第三层循环的flag改为Fasle,第二层的flag还是True,这样进入就可以退出第三层循环进入第二层循环,进入第二层循环的时候再把第三城循环的flag改为True,这样就能保证第二层循环输入正确的菜单选项后还能正常进入第三层循环。依次类推。
流程图:

代码:
#!/usr/bin/env python3
# coding:utf-8
'''
Created on: 2015年12月30日 @author: 张晓宇 Email: 61411916@qq.com Version: 1.0 Description: 三层菜单
1、菜单一共三级即:省,市,区县
2、每一级菜单输入的如果输入的是菜单里的选项则进入下级菜单
3、第1级菜单输入q退出系统
4、第2、3级菜单输入q退出系统,输入b返回上级菜单
5、三级菜单全部正确打印最后的全部选择结果,否则继续循环该机菜单 Help:
''' if __name__ == '__main__':
'''
@parameters:
provinces:定义省一级菜单,格式为字典,{"菜单序号":"省名称", ...}
citys:定义省一级菜单,格式为二级嵌套字典{"省名称":{"菜单序号":"市名称"}, ...}
area:定义区县一级菜单,格式为二级嵌套字典{"市名称":{"菜单序号":"区县名称"}, ...}
app_info:系统信息,主要用于显示
'''
provinces = {
"":"北京",
"":"上海",
"":"河北省",
}
citys = {
"北京":{"":"北京市区","":"北京市郊区"},
"上海":{"":"上海市区"},
"河北省":{"":"石家庄市", "":"秦皇岛市", "":"保定市"}
}
areas = {
"北京市区":{"":"东城区", "":"西城区", "":"海淀区", "":"朝阳区", "":"丰台区", "":"石景山区"},
"北京市郊区":{ "":"通州区", "":"顺义区", "":"房山区", "":"大兴区", "":"昌平区", "":"怀柔区", "":"平谷区", "":"门头沟区", "":"密云县", "":"延庆县"},
"上海市区":{"":"黄浦区", "":"卢湾区", "":"徐汇区", "":"长宁区", "":"静安区", "":"普陀区", "":"闸北区", "":"虹口区", "":"杨浦区", "":"宝山区"},
"石家庄市":{"":"鹿泉", "":"正定", "":"藁城", "":"栾城", "":"高邑", "":"新乐", "":"辛集", "":"赵县", "":"深泽", "":"晋州"},
"保定市":{"":"南市区", "":"北市区", "":"新市区", "":"白沟新城区", "":"顺平县"},
"秦皇岛市":{"":"海港区", "":"山海关区", "":"北戴河区", "":"抚宁区", "":"昌黎县", "":"卢龙县", "":"青龙满族自治县"}
} app_info = '''
+-----------------------------------+
| Welcome to 65brother system |
| Version: 1.0 |
| Author: zhangxiaoyu |
+-----------------------------------+
'''
# 初始化菜单列表,主要是做了一次排序,解决字典无序的问题,这里的d[0]表示对key做排序,int表示先转换成整数,也就是按照整数的顺序进行排序否则如果序号超过10,会出现1后面的是10而不是2
province_list = sorted(provinces.items(), key = lambda d:int(d[0]))
# 初始化省一级菜单循环开关
province_flag = True
# 省一级菜单循环
while province_flag:
# 初始化市一级菜单的循环开关
city_flag = True
print(app_info)
# 打印当前用户的位置
print("home>")
# 打印省一级菜单
print("+-----------------------------------+")
for province_item in province_list:
print(" %s、%s" %province_item)
print("+-----------------------------------+")
# 获取用户输入的选项
province = input("请输入你的省份(输入'q'退出系统):").strip()
# 判断用户的输入
if province == 'q':
# 如果用户输入的是q关闭省一级菜单循环开关,也就是退出系统
province_flag = False
elif province in provinces:
# 如果输入的是菜单的序号执行
# 获取省的名称
province_name = provinces[province]
# 初始化市一级菜单,同省一样对key进行排序
city_list = sorted(citys[province_name].items(), key = lambda d:int(d[0]))
# 市一级菜单循环
while city_flag:
# 打印用户位置
print("home>%s>" %province_name)
# 打印市一级菜单
print("+-----------------------------------+")
for city_item in city_list:
print(" %s、%s" %city_item)
print("+-----------------------------------+")
# 获取用户输入
city = input("请输入你的城市(输入'q'退出系统,输入'b'返回上一级菜单):").strip()
# 判断用户输入
if city == 'q':
# 如果输入q关闭省一级和市一级循环开关,也就是退出系统
province_flag = False
city_flag = False
elif city == 'b':
# 如果用户输入的是b,关闭市一级循环开关,继续省一级循环
city_flag = False
elif city in citys[province_name]:
# 如果用户输入的是正确的菜单项
# 初始化区县一级循环开关
area_flag = True
# 获取市的名称
city_name = citys[province_name][city]
# 初始户区县菜单
area_list = sorted(areas[city_name].items(), key = lambda d:int(d[0]))
# 区县一级循环
while area_flag:
# 打印用户位置
print("home>%s>%s>" %(province_name,city_name))
# 打印区县菜单
print("+-----------------------------------+")
for area_item in area_list:
print(" %s、%s" %area_item)
print("+-----------------------------------+")
# 获取用户输入
area = input("请输入你的区/县(输入'q'退出系统,输入'b'返回上一级菜单):").strip()
# 判断用户输入
if area == 'q':
# 如果是q,关闭省、市、区县一级循环开关,也就是退出系统
area_flag = False
city_flag = False
province_flag = False
elif area == 'b':
# 如果是b,关闭县一级循环开关,继续市循环
area_flag = False
elif area in areas[city_name]:
# 如果输入正确
# 获取区县名称
area_name = areas[city_name][area]
# 输出完整的三级菜单选择信息
input('您选择的是%s,%s,%s。选择任意键退出系统' %(province_name, city_name, area_name))
# 关闭省、市、区县循环开关,退出系统
area_flag = False
city_flag = False
province_flag = False
else:
# 如果区县选项输入错误提示错误
input("输入错误请重新输入,输入任意键继续")
else:
# 如果市选项输入错误提示错误
input("输入错误请重新输入,输入任意键继续")
else:
# 如果省选项输入错误提示错误
input("输入错误请重新输入,输入任意键继续")
代码说明:
1、菜单的数据类型为了减少遍历判断所以还是使用了字典,第一级菜单为根,key是菜单的编号也就是输入时候对应的字符,value为菜单的名称,从第二级菜单开始,改为嵌套的字典第一层,第二级菜单的key是上一级的value,value和和第一级别一样的结构,key是菜单选项,value是菜单名称。第三级和第二级一样,第一层key是第二级菜单的菜单名称,value是就是菜单体
2、关于内置的sorted函数,这是用来排序的一个内置函数,这里主要用它给个字典进行排序。sorted(provinces.items(), key = lambda d:int(d[0])),这里的第一个参数是一个列表,就是通过字典的items方法返回的列表,返回的类似这样[('3', '河北省'), ('2', '上海'), ('1', '北京')],列表里嵌套了元祖,元祖的第0号元素是原来字典的key,第1号元素是原来字典的值。第二个参数key是排序关键字,也就是按照什么来排序,这里传递的一个方法,这里的方法就是相当于就是把items方法返回的列表的每一个元祖的第一个元素也就是原来字典的key,也就是按照key来排序。返回的就是好顺序的列表[('1', '北京'), ('2', '上海'), ('3', '河北省')]。注意这里返回的列表不是字典,字典是无序,还返回字典的话没有意义。
我的Python成长之路---第一天---Python基础(作业2:三级菜单)---2015年12月26日(雾霾)的更多相关文章
- 我的Python成长之路---第一天---Python基础(1)---2015年12月26日(雾霾)
2015年12月26日是个特别的日子,我的Python成之路迈出第一步.见到了心目中的Python大神(Alex),也认识到了新的志向相投的伙伴,非常开心. 尽管之前看过一些Python的视频.书,算 ...
- python成长之路-----day1-----作业(登录程序和三级菜单)
作业: 作业1:用户登录 1)程序说明: a.用户输入密码验证成功然后打印欢迎信息 b.如果密码错误,用户登录失败,提示用户,密码错误 c.用户输入密码错误3次,则用户锁定 d.当用户多次输入不存在的 ...
- 我的Python成长之路---第一天---Python基础(6)---2015年12月26日(雾霾)
七.列表——list Python的列表是一种内置的数据类型,是由Python的基本数据类型组成的有序的集合.有点类似C语言的数组,但与数组不同的是,Python在定义列表的时候不用指定列表的容积(长 ...
- 我的Python成长之路---第一天---Python基础(2)---2015年12月26日(雾霾)
三.数据类型 Python基本类型(能够直接处理的数据类型有以下几种)主要有5种 1.整数(int) Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如 ...
- 我的Python成长之路---第一天---Python基础(4)---2015年12月26日(雾霾)
五.数据运算与数据运算符 1.算术运算符 算术运算符 运算符 描述 示例 + 加法 >>> 14 - 5 9 - 减法 >>> 14 - 5 9 * 乘法 &g ...
- 我的Python成长之路---第一天---Python基础(5)---2015年12月26日(雾霾)
六.流程控制 与C语言不通的事Python的流程控制的代码块不是用{}花括号表示的,而是用强制缩进来,而且缩进必须一致,官方推荐是使用4个空格,不建议使用使用tab(制表符)做缩进,一是不同的系统ta ...
- 我的Python成长之路---第一天---Python基础(3)---2015年12月26日(雾霾)
四.变量和常量 变量是用来存储程序运行期间需要临时保存可以不断改变的数据的标识符.Python有自身的内存回收机制,所以在开发过程中不用考虑变量的销毁等 Python中的变量名命名有如下规则: 1.变 ...
- 我的Python成长之路---第一天---Python基础(作业1:登录验证)---2015年12月26日(雾霾)
作业一:编写登录接口 输入用户名密码 认证成功系那是欢迎信息 输错三次后锁定 思路: 1.参考模型,这个作业我参考了linux的登录认证流程以及结合网上银行支付宝等锁定规则 1)认证流程参考的是Lin ...
- python成长之路第一篇(5)文件的基本操作
一.三元运算 我们在上章学习的if,,else,,有一种简便的方法 他的表达式是这样的:变量 = 值1 if 条件 else 值2 解释过来就是如果aaa等于sss则输出值1否则输出值2 二.类的概念 ...
随机推荐
- [python网络编程]DNSserver
在上一篇中,使用scrapy改动源IP发送请求的最后我们提到因为hosts文件不支持正则,会导致我们的随机域名DNS查询失败. 使用DNS代理服务器能够解决问题, 以下是我用gevent写的小工具.非 ...
- HDU 4725 The Shortest Path in Nya Graph-【SPFA最短路】
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题意:有N个点和N层..一层有X个点(0<=X<=N).两邻两层间有一条路花费C.还有M ...
- Android 中文API (67) —— BluetoothClass.Device.Major
前言 本章内容是android.bluetooth.BluetoothClass.Device.Major,为Android蓝牙部分的章节翻译,版本为Android 2.3 r1,翻译来自中山大学 ...
- js 精美倒计时
精美倒计时*{ padding:0; margin:0;}.colockbox{width:250px;height:30px;background:url(/jscss/demoimg/201312 ...
- java注解入门(含源码下载)
注解(Annotation)是从jdk1.5开始增加的特性.学习注解能够读懂框架的代码:让编程更加简洁,代码更加清晰. 注解概念:java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法. ...
- judge loop in undirected graph
一 深度优先遍历,参考前面DFS(white and gray and black) 二 根据定点以及边数目进行判断 如果m(edge)大于n(vertex),那么肯定存在环 算法如下: 1 删除所有 ...
- (IOS)Apple 证书相关
1.私钥 本地钥匙串程序创建<证书请求文件>(.certSigningRequest),用其向苹果申请下载<证书文件>/<私钥>(.cer),并安装到钥匙串: 团队 ...
- [代码搜索]OpenGrok搭建简易教程
面对着动辄几十GB且随时不断更新的大型代码,我们产生了以下需求:1.快速搜索代码2.代码存放于本地/服务器3.代码可跳转4.跨平台5.易于维护... 显然SourceInsight.ctags.gre ...
- QT绘制半透明窗体(改写paintEvent,超级简单)
在派生类中重载QDialog的void paintEvent(QPaintEvent *)事件,在这个函数中加入以下代码 QPainter painter(this); QLinearGradi ...
- 数据结构——二叉搜索树(Binary Search Tree)
二叉树(Binary Tree)的基础下 每个父节点下 左节点小,右节点大. 节点的插入: 若root==NULL则root=newnode 否则不断与节点值比较,较小则向左比较,较大则向右比较. 完 ...