我的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 二.类的概念 ...
随机推荐
- UVA 11754 - Code Feat(数论)
UVA 11754 - Code Feat 题目链接 题意:给定一个c个x, y1,y2,y3..yk形式,前s小的答案满足s % x在集合y1, y2, y3 ... yk中 思路:LRJ大白例题, ...
- C# Code Snip
1.Tryf + TAB+TAB try { } finally { } 2.Prop+Tab+Tab public int MyProperty { get; set; } 3. #region + ...
- CSS的position(位置)
position: 位置,absolute绝对位置,相对于浏览器边界的位置:relative相对位置,相对于它本应该出现的位置.fixed:固定位置,它不会随着滚动. 设置好position之后,就可 ...
- javascript 简易文本编辑器
转载请注明出处:http://www.cnblogs.com/enzozo/p/4357031.html 写在前面: 本文本编辑器具备功能:选择字体大小.颜色.加粗.斜体.下划线.点击 'Submit ...
- Android——用户登陆及用户名和密码的保存
Android——用户登陆及用户名和密码的保存 在之前的学习过程中已经将Android学习完了,但是在后面将近一年的时间里都没有进行过Android开发,所以对Android的所有的知识点又有点忘 ...
- Python IDLE快捷键
编辑状态时:Ctrl + [ .Ctrl + ] 缩进代码Alt+3 Alt+4 注释.取消注释代码行Alt+5 Alt+6 切换缩进方式 空格<=>TabAlt+/ 单词完成,只要文中出 ...
- Spring读书笔记-----部署我的第一个Spring项目
一.Spring介绍 Spring是一个轻量级的Java EE容器,它也是一种从实际需求出发,着眼于轻便,灵活,易于开发,易测试和易部署的轻量级开发框架.Spring它完成了大量开发中的通用步骤,留给 ...
- perl学习(4) 子程序
子程序,类比c语言中的函数,在形式上个人认为最大的区别:没有形参 1.1.定义子程序 1.2.调用 #! /usr/bin/perl sub marine { $n += 1 ; print &quo ...
- python获取当前路径的方法
>>> import os>>> homedir = os.getcwd()>>> print homedirD:\python\test > ...
- Shiro入门(1)
=============基本概念=================== 什么是Apache Shiro? Apache Shiro(发音为“shee-roh”,日语“堡垒(Castle)”的意思)是 ...