作业二:三级菜单

  1. 三级菜单
  2. 可一次进入各个子菜单

思路:

这个题看似不难,难点在于三层循环的嵌套,我的思路就是通过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日(雾霾)的更多相关文章

  1. 我的Python成长之路---第一天---Python基础(1)---2015年12月26日(雾霾)

    2015年12月26日是个特别的日子,我的Python成之路迈出第一步.见到了心目中的Python大神(Alex),也认识到了新的志向相投的伙伴,非常开心. 尽管之前看过一些Python的视频.书,算 ...

  2. python成长之路-----day1-----作业(登录程序和三级菜单)

    作业: 作业1:用户登录 1)程序说明: a.用户输入密码验证成功然后打印欢迎信息 b.如果密码错误,用户登录失败,提示用户,密码错误 c.用户输入密码错误3次,则用户锁定 d.当用户多次输入不存在的 ...

  3. 我的Python成长之路---第一天---Python基础(6)---2015年12月26日(雾霾)

    七.列表——list Python的列表是一种内置的数据类型,是由Python的基本数据类型组成的有序的集合.有点类似C语言的数组,但与数组不同的是,Python在定义列表的时候不用指定列表的容积(长 ...

  4. 我的Python成长之路---第一天---Python基础(2)---2015年12月26日(雾霾)

    三.数据类型 Python基本类型(能够直接处理的数据类型有以下几种)主要有5种 1.整数(int) Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如 ...

  5. 我的Python成长之路---第一天---Python基础(4)---2015年12月26日(雾霾)

    五.数据运算与数据运算符 1.算术运算符 算术运算符 运算符 描述 示例 + 加法 >>> 14 - 5 9 - 减法 >>> 14 - 5 9  *  乘法 &g ...

  6. 我的Python成长之路---第一天---Python基础(5)---2015年12月26日(雾霾)

    六.流程控制 与C语言不通的事Python的流程控制的代码块不是用{}花括号表示的,而是用强制缩进来,而且缩进必须一致,官方推荐是使用4个空格,不建议使用使用tab(制表符)做缩进,一是不同的系统ta ...

  7. 我的Python成长之路---第一天---Python基础(3)---2015年12月26日(雾霾)

    四.变量和常量 变量是用来存储程序运行期间需要临时保存可以不断改变的数据的标识符.Python有自身的内存回收机制,所以在开发过程中不用考虑变量的销毁等 Python中的变量名命名有如下规则: 1.变 ...

  8. 我的Python成长之路---第一天---Python基础(作业1:登录验证)---2015年12月26日(雾霾)

    作业一:编写登录接口 输入用户名密码 认证成功系那是欢迎信息 输错三次后锁定 思路: 1.参考模型,这个作业我参考了linux的登录认证流程以及结合网上银行支付宝等锁定规则 1)认证流程参考的是Lin ...

  9. python成长之路第一篇(5)文件的基本操作

    一.三元运算 我们在上章学习的if,,else,,有一种简便的方法 他的表达式是这样的:变量 = 值1 if 条件 else 值2 解释过来就是如果aaa等于sss则输出值1否则输出值2 二.类的概念 ...

随机推荐

  1. C语言小结

    1.输入输出: char s; printf("Enter a string"); scanf("%s",&s); printf(''Hello,%s& ...

  2. FeatureLayer,FeatureDataset,FeatureClass,Feature的概念

    刚学AE,其中很多概念都模糊不清.经过一段时间的摸索总结,对FeatureLayer,FeatureDataset,FeatureClass,Feature几个概念有了一点认识.拿出来分享一下,有错误 ...

  3. iOS开发MAC下配置Svn和Git

    如果你对iOS开发中的版本控制还不了解那么你可以先看看这篇(大致看一遍就ok) http://www.cnblogs.com/iCocos/p/4767692.html   关于版本控制使用起来并不难 ...

  4. IBatis.Net XML文件配置

    一.添加Provider.config <?xml version="1.0" encoding="utf-8"?> <providers x ...

  5. 关于java.sql.SQLRecoverableException: Closed Connection异常的解决方案(转)

    在项目中碰到了一个应用异常,从表象来看应用僵死.查看Weblogic状态为Running,内存无溢出,但是出现多次线程堵塞.查看Weblogic日志,发现程序出现多次Time Out. 我们知道,We ...

  6. java实现文件传输

    在windows下装了个linux虚拟机,两者之间传输文件挺麻烦的.写了个简单的文件传输程序,来方便自己数据传送. server 端: import java.io.BufferedReader;im ...

  7. oracle 查询优化改写

    -----------书籍: oracle 查询优化改写-----------第1个“C###oracle”为登录数据库的用户名,第2个“oracleChange”为登录数据库的密码“oracleCh ...

  8. 3.3.5 DMA写时发生Cache命中的优化

    在许多高性能处理器中,还提出了一些新的概念,以加速外设到存储器的DMA写过程.如Freescale的I/O Stashing和Intel的IOAT技术. 如图3?8所示,当设备进行存储器写时,如果可以 ...

  9. python rpyc 报错: AttributeError: cannot access &#39;new&#39;

    Error msg: Traceback (most recent call last): File "/home/hpcm/Desktop/test/install/client.py&q ...

  10. 微信小程序 text属性设置 WXSS样式

    >微信小程序的布局css样式 参考自  珺L 文字 width: fit-content;font-size:20px;      /*设置文字字号*/color:red;           ...