python练习_三级菜单

需求:

  1. 做一个地区查询三级菜单,输入一级能够打印下一级
  2. 在第三级个第二级输入e可以返回上一级
  3. 在任意一级输入q则退出程序

以下代码实现的功能与思路:

功能: 

  (1)通过Initialize_data模块格式化DATA中的数据,生成嵌套的列表
  (2)独立的用户输入验证模块,减少一部分重复代码
  (3)输入e则返回上级菜单
  (4)输入q则退出程序
  (5)到地区的级别后每选择一个地区就会打开百度此地区的结果

思路:

   1、通过文件存储地区的数据,然后通过def Initialize_data()函数(自己写的)把文件中的数据格式化成为一个嵌套列表

   2、通过用户输入编号来去匹配列表中的字段,如果匹配对了则进入下一级

   3、判断用户输入匹配到e和q时,做返回上级和退出的操作

   4、每一级都需要使用死循环,当匹配e的时候做break的操作即可

流程图:

使用方法: 

  执行环境:Python3.5版本 

  直接运行即可

代码:

首先在脚本根目录创建一个DATA的文件用于存储地区信息,不要带txt等结尾

华北地区
河北省:
#石家庄 唐山 秦皇岛 邯郸 邢台 保定 张家口 承德 沧州 廊坊 衡水
山西省:
#太原 大同 阳泉 长治 晋城 朔州 晋中 运城 忻州 临汾 吕梁
内蒙古自治区省:
#呼和浩特 包头 乌海 赤峰 通辽 鄂尔多斯 呼伦贝尔 巴彦淖尔盟 兴安盟 锡林郭勒盟 满洲里 阿拉善盟 乌兰察布盟 二连浩特
东北地区
辽宁省:
#沈阳 大连 鞍山 抚顺 本溪 丹东 锦州 营口 阜新 辽阳 盘锦 铁岭 朝阳 葫芦岛
吉林省:
#长春 吉林 四平 辽源 通化 白山 松原 白城 延边朝鲜族自治州
黑龙江省:
#哈尔滨 齐齐哈尔 鸡西 鹤岗 双鸭山 大庆 伊春 佳木斯 七台河 牡丹江 黑河 绥化 大兴安岭
华东地区
江苏省:
#南京 无锡 徐州 常州 苏州 南通 连云港 淮安 盐城 扬州 镇江 泰州 宿迁
浙江省:
#杭州 宁波 温州 嘉兴 湖州 绍兴 金华 衢州 舟山 台州 丽水
安徽省:
#合肥 芜湖 蚌埠 淮南 马鞍山 淮北 铜陵 安庆 黄山 滁州 阜阳 宿州 巢湖 六安 亳州 池州 宣城
福建省:
#福州 厦门 莆田 三明 泉州 漳州 南平 龙岩 宁德
江西省:
#南昌 景德镇 萍乡 九江 新余 鹰潭 赣州 吉安 宜春 抚州 上饶
山东省:
#济南 青岛 淄博 枣庄 东营 烟台 潍坊 威海 济宁 泰安 日照 莱芜 临沂 德州 聊城 滨州 菏泽
中南地区
河南省:
#郑州 开封 洛阳 平顶山 焦作 鹤壁 新乡 安阳 濮阳 许昌 漯河 三门峡 南阳 商丘 信阳 周口 驻马店
湖北省:
#武汉 黄石 襄樊 十堰 荆州 宜昌 荆门 鄂州 孝感 黄冈 咸宁 随州 恩施州
湖南省:
#长沙 株洲 湘潭 衡阳 邵阳 岳阳 常德 张家界 益阳 郴州 永州 怀化 娄底 湘西州
广东省:
#广州 深圳 珠海 汕头 韶关 佛山 江门 湛江 茂名 肇庆 惠州 梅州 汕尾 河源 阳江 清远 东莞 中山 潮州 揭阳 云浮
海南省:
#海口 三亚 白沙黎族自治县 昌江黎族自治县 乐东黎族自治县 陵水黎族自治县 保亭黎族苗族自治县 琼中黎族苗族自治县 西沙群岛 南沙群岛 中沙群岛 五指山 琼海 儋州 文昌 万宁 东方 定安县 屯昌县 澄迈县 临高县
西南地区
四川省:
#成都 自贡 攀枝花 泸州 德阳 绵阳 广元 遂宁 内江 乐山 南充 宜宾 广安 达州 眉山 雅安 巴中 资阳 阿坝州 甘孜州 凉山州
贵州省:
#贵阳 六盘水 遵义 安顺 铜仁 毕节 黔西南州 黔东南州 黔南州
云南省:
#昆明 曲靖 玉溪 保山 昭通 丽江 普洱 临沧 文山州 红河州 西双版纳 楚雄州 大理 德宏州 怒江州 迪庆州 思茅
西北地区
陕西省:
#西安 铜川 宝鸡 咸阳 渭南 延安 汉中 榆林 安康 商洛
甘肃省:
#兰州 嘉峪关 金昌 白银 天水 武威 张掖 平凉 酒泉 庆阳 定西 陇南 临夏州 甘南州
青海省:
#西宁 海东 海北州 黄南州 海南州 果洛州 玉树州 海西州
其他地区
直辖市:
#北京 重庆 天津 上海
内蒙古自治:
#呼和浩特包头 乌海 赤峰 通辽 鄂尔多斯 呼伦贝尔 巴彦淖尔盟 兴安盟 锡林郭勒盟 满洲里 阿拉善盟 乌兰察布盟 二连浩特
西藏自治:
#拉萨 昌都 山南 日喀则 那曲 阿里 林芝
宁夏回族自治区:
#银川 石嘴山 吴忠 固原 中卫
新疆维吾尔自治区:
#乌鲁木齐 克拉玛依 吐鲁番 哈密 昌吉州 博尔塔拉州 巴音郭楞州 阿克苏 克孜勒苏州 喀什 和田 伊犁州 塔城 阿勒泰
特别行政区:
#香港 澳门
台湾省:
#台北 中坜 大甲 雾峰 虎尾 台东 基隆 礁溪 苏澳 埔里 田中 冈山 大溪 宜兰 清水 梨山 门六 旗山 瑞芳 九曲堂 沙鹿 花莲 大林 凤山 桃园 澎湖 大肚 乌日 民雄 屏东 湖口 中兴新村 彰化 员林 北港 潮州 竹北 竹东 鹿港 永靖 嘉义 东港 新竹 罗东 后里 日月潭 新营 楠梓 竹南 苗栗 丰原 南投 善化 左营 莺歌 日南 台中 社头

DATA

程序代码

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
import time
import webbrowser
data_list = []
def Initialize_data():
'''
将DATA文件中的内容格式化成一个列表
'''
count_area = 0
count_province = 0
with open("DATA","rU",encoding="utf-8") as region_lists:
for region in region_lists:
area_list = re.findall("\w+区$",region)
if len(area_list):
count_area+=1
data_list.append(area_list)
count_province = 0
province_list = re.findall("\D*:$",region)
if len(province_list):
province_sav = province_list[0].split(":")
province_sav.remove("")
count_province+=1
data_list[count_area-1].append(province_sav)
if "#" in region:
city_lists=region.split("\n")
city_lists = city_lists[0].split("#")
city_lists.remove("")
data_list[count_area-1][count_province].append(city_lists) def validation(userins,lists):
'''
验证用户输入的编号是否正确
判断用户输入的是否是数字,是否大于0 是否等于小于传入列表的长度
:param userins:
:param lists:
:return:
'''
if userins.isdigit():
if int(userins) > 0 and int(userins) <= len(lists):
return True
else:
print("\033[31m编号不存在\033[0m")
else:
if userins == "q":
print("\033[32m已退出\033[0m")
exit()
elif userins == "e":
return "e"
else:
print("\033[31m输入错误\033[0m") def province():
'''
省份逻辑函数
'''
while True:
print("省份".center(40,"-"))
for prin_province in data_list[int(userin)-1]:
if prin_province == data_list[int(userin)-1][0]:
pass
else:
print(" "*14,data_list[int(userin)-1].index(prin_province),prin_province[0])
print("-"*42)
cityin = input("二级菜单,请输入省市编号当前位置[%s](q退出,e返回上级):"%data_list[int(userin)-1][0])
province_return = validation(cityin,data_list[int(userin)-1])
if province_return == True:
region_dara_ma = data_list[int(userin)-1][int(cityin)][1][0].split()
region(region_dara_ma,cityin)
elif province_return == "e":
break def region(region_dara,cityina):
'''
地区逻辑函数
如果验证用户输入的函数返回True则可以打卡读取相关信息,返回值为e则返回上级菜单
'''
while True:
print("地区".center(40,"-"))
for i in region_dara:
aaa = region_dara.index(i)+1
print(" "*14,aaa,i)
print("-"*42)
region = input("三级菜单,请输入地区编号当前位置[%s](q退出,e返回上级):"%data_list[int(userin)-1][int(cityina)][0])
region_return = validation(region,region_dara)
if region_return == True:
print("正在打开[%s]地区相关信息"%region_dara[int(region)-1])
openurl = "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%s"%region_dara[int(region)-1]
webbrowser.open(openurl,new=0,autoraise=True)
time.sleep(1)
input("回车继续:")
elif region_return == "e":
break def menu_main ():
'''
大区逻辑函数
如果验证用户输入的函数返回True则可以正常进入二级菜单
'''
while True:
global userin
print("大区".center(40,"-"))
for i in data_list:
print(" "*14,data_list.index(i)+1,i[0])
print("-"*42)
userin = input("一级菜单,请输入大区对于的编号(q退出):")
vali_return = validation(userin,data_list)
if vali_return == True:
province()
elif vali_return == "e":
print("输入错误") if __name__ == "__main__":
Initialize_data()
menu_main ()

三级菜单

执行效果:

python练习_三级菜单的更多相关文章

  1. (转)Python字典实现三级菜单

    Python字典实现三级菜单 原文:https://www.cnblogs.com/pyramid1001/p/5803294.html 1 ############################# ...

  2. Python学习之三级菜单

    Python经典练习题 - 三级菜单 需求: 可依次选择进入各子菜单 可从任意一层往回退到上一层 可从任意一层退出程序 示例代码: # -*- coding: utf-8 -*- menu = { ' ...

  3. python 购物车和三级菜单

    程序:购物车程序 需求: 启动程序后,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额 ...

  4. python day1 之三级菜单的正确姿势

    看了几个同学有关三级菜单的实现,都是通过一级一级输出,是较为过程的实现.另外如果菜单(树形结构)更多级这样处理起来就比较麻烦了. 可以使用python强大的列表和字典,实现的更优美或简洁一些: 注:复 ...

  5. python作业:三级菜单(第一周)

    一.作业需求: 1. 运行程序输出第一级菜单 2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单 3. 菜单数据保存在文件中 4. 让用户选择是否要退出 5. 有返回上一级菜单的功能 二.三级菜单 ...

  6. Python字典实现三级菜单

    ################################################ # Task Name: 三级菜单 # # Description:打印省.市.县三级菜单 # # 可 ...

  7. python 小程序—三级菜单—循环和字典练习

    程序中利用多级字典来存储三级菜单, 通过一系列while循环和for循环,实现了三级菜单的查询,选择,退回上级菜单,退出程序几个功能. 缺点:程序语句过于重复,效率低. #-*-coding:utf- ...

  8. python_入门_三级菜单

    '''程序:三级菜单要求:1.打印省.市.县三级菜单2.可返回上一级3.可随时退出程序''' # -*- coding: utf-8 -*- # __author__ = 'qi' prov_city ...

  9. Python 练习:三级菜单选择城市(二)

    优化了上一个三级菜单选择城:http://www.cnblogs.com/klvchen/p/8646466.html info = { 'GuangDong':{ 'GuangZhou': ['Ti ...

随机推荐

  1. CodeIgniter框架——CI组件间信息流走向

    组件间信息流的走向图: 实线表示直接函数调用. 这些信息流可以从控制器到视图,也可以从控制器到类库或模型.(模型也能调用视图,但理论上这样做不合适.)相反方向就不能调用,如:视图不能调用控制器.然而, ...

  2. A Secret(KMP)

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total ...

  3. 一篇搞定SQLAlchemy--关系对象映射

    要使用SQLAlchemy,必须先下载这个模块 pip3 install sqlalchemy 或 pycharm File--> Settings-->project...-->P ...

  4. 我的Android进阶之旅------>Android中查看应用签名信息

    一.查看自己的证书签名信息 如上一篇文章<我的Android进阶之旅------>Android中制作和查看自定义的Debug版本Android签名证书>地址:http://blog ...

  5. Android系统移植与调试之------->如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏

    这两天由于一个客户的要求,将MID竖屏时候的状态条上的音量键去掉.所以尝试修改了一下,成功了,分享一下经验. 先看一下修改后的效果图,如下所示 . 横屏的时候:有音量加减键 竖屏的时候:音量加减键被去 ...

  6. NPOI 导入 导出

    using NPOI.XSSF.UserModel;   using System.IO; 导入 /// <summary> /// Excel转换DataTable /// </s ...

  7. ajax图片上传功能

    一.应用场景 当用户需要上传图片当做自己的头像时,预览的时候该图片需要在本地预览,不应该通过网络从服务器上取到之后预览 二.实现方法 1.方法1: 注释:给上传文件的input标签绑定一个change ...

  8. php 数组 高效随机抽取指定条记录的算法

    php使用数组array_rand()函数进行高效随机抽取指定条数的记录,可以随机抽取数据库中的记录,适合进行随机展示和抽奖程序. 该算法主要是利用php的array_rand()函数,下面看一下ar ...

  9. 源码编译搭建LAMP

    环境版本信息: RHEL 5.3 Apache / 2.4.16 PHP / 5.4.45 mysql-5.5.45 源代码编译 安装方式 1: configure 配置 以及定制我们的软件包 2: ...

  10. 【鸟哥的Linux私房菜】笔记

    操作系统核心的功能! 驱动程序与操作系统的关系 2. [计算机组成之组件] 3.CPU实际要处理的数据完全来自于主存储器,这是一个很重要的概念! 4.CPU是整个计算机系统最重要的部分,那么目前世界上 ...