一、作业要求

  1.使用字典实现三级菜单功能

  2.直接输入前面数字进入下一级菜单

  3.按B返回上一级,按Q退出

二、需要知识点

  1.if循环

  2.for循环,enumerate的用法

  3.while循环

  4.list的append和del的用法,索引,切片

  5.dict的读取keys,values

  \033[31;1m   内容 \033[1m  是给内容加颜色的

三、实现思路及使用的代码解析

  1.读取字典的keys是一个列表,所以使用for循环读取字典第一级的keys,并打印出来

for city in china_ditie.keys():
print(city)

  2.需要在前面加上编号,使用enumerate自动编号,并且把打印的城市名称加入到列表中

for v,city in enumerate(china_ditie.keys(),1):#循环输出字典中的城市
print(v,city)#打印城市列表并编号
city_list.append(city)#把城市名城加入一个列表里面

  3.让用户输入编号,如果不是数字,提示错误,如果输入数字不在里面也提示错误,让重新输入 

    if c_city.isdigit():#判断输入是否为数字,数字转换成int类型
c_city = int(c_city)
if c_city <= len(city_list) and c_city >0:#判断输入编号是否存在

  4.如果数字存在的话就打印选择的对应的values 的keys ,因为我们要实现的是数字,所以我们把一级菜单存入了一个列表中,而且也知道了它的索引v-1,打印即可。

for x,xian in enumerate(china_ditie[city_list[c_city-1]].keys(),1):#循环城市下地铁线路名称
print(x,xian)#打印线路名称
xian_list.append(xian)#将线路加入到线路列表中

  5.注意输入退出和b的对应级别,每层需要加入循环才可以实现返回上一级别,python是需要缩进的。

  6.每次返回记得将列表的数据全部清空

del city_list[:]  # 删除城市列表内所有数据
del xian_list[:] # 删除线路列表内的数据

四、扩谱图

四、作业代码

 #!/usr/bin/env python
# -*- coding=utf-8 -*-
# From Hairui
# python3 china_ditie = {
"北京": {
"一号线": ["四惠", "大望路", "天安门", "西单"], "二号线": ["北京站", "朝阳门", "东直门", "西直门"], "三号线": ["国贸", "三元桥", "知春路", "巴沟"] },
"上海": {
"四号线": ["徐家汇", "人民广场", "延长路", "共康路", "呼兰路"], "五号线": ["东昌路", "静安寺", "江苏路", "虹桥火车站"], "六号线": ["宝山路", "赤峰路", "曹阳路", "虹桥路", "宜山路"] },
"广州": {
"七号线": ["东山口", "农讲所", "烈士陵园", "公园前", "体育西路"], "八号线": ["黄边", "纪念堂", "三元里", "白云公园"], "九号线": ["沙河顶", "北京路", "一德路", "文化公园"] },
"深圳": {
"一号线": ["高新园", "桃园", "白石洲", "华侨城"], "四号线": ["白石龙", "明乐", "少年宫", "红山"], "五号线": ["大学城", "兴东", "西里", "深圳北站"] }, }#程序开始
import time
start = True
city_list = []
xian_list = []
print("\033[31;1m欢迎访问地铁查询系统\033[1m".center(40,"="))
while start:
print("".center(36,"="))
for v,city in enumerate(china_ditie.keys(),1):#循环输出字典中的城市
print(v,city)#打印城市列表并编号
city_list.append(city)#把城市名城加入一个列表里面
print("退出 \033[31;1mq\033[1m")#提醒信息退出按Q
print("".center(36,"="))#分隔符
c_city = input("请选择你要查询的城市编号:")#输入城市编号
print("".center(36, "=")) # 分割线
if c_city == "q" or c_city == "Q":#打印城市列表选择Q退出
break
if c_city.isdigit():#判断输入是否为数字,数字转换成int类型
c_city = int(c_city)
if c_city <= len(city_list) and c_city >0:#判断输入编号是否存在
while start:
# if city_list[c_city-1] in china_ditie.keys():#判断输入城市是否在字典中
for x,xian in enumerate(china_ditie[city_list[c_city-1]].keys(),1):#循环城市下地铁线路名称
print(x,xian)#打印线路名称
xian_list.append(xian)#将线路加入到线路列表中
print("返回上一级\033[31;1mb\033[1m,退出 \033[31;1mq\033[1m")
print("".center(36, "="))#分割线
c_xian = input("请选择你要查询的线路:")#让用户输入查询的线路
print("".center(36, "=")) # 分割线
if c_xian == "b" or c_xian == "B": # 退出当前循环,返回上一级
del city_list[:] # 删除城市列表内所有数据
del xian_list[:] # 删除县列表内的数据
break
elif c_xian == "q" or c_xian == "Q": # 退出程序
start = False
elif c_xian.isdigit():#输入的数字变成的int类型
c_xian = int(c_xian)
if c_xian <= len(xian_list) and c_xian > 0:#判断输入的是否是在列表长度内
while start:
for name in china_ditie[city_list[c_city-1]][xian_list[c_xian-1]]:#循环字典中地铁站的名称
print(name)#打印字典中内容
print("返回上一级 \033[31;1mb\033[1m ,退出 \033[31;1mq\033[1m")
print("".center(36, "="))#分割线
c_n = input("请输入你需要的操作:")
if c_n == "b" or c_n == "B":
del xian_list[:]
break
elif c_n == "q" or c_n == "Q":#退出程序
start = False
else:
print("\033[31;1m输入错误请重新输入,退出请按\033[31;1mq\033[1m!\033[1m")
time.sleep(1)
else:
del xian_list[:]
print("\033[31;1m没有此线路或者输入错误!\033[1m")
time.sleep(1)
else:
del xian_list[:]
print("\033[31;1m输入错误,请输数字!\033[1m")
time.sleep(1)
else: # 输入错误提示并刷新城市列表
del city_list[:]
print("\033[31;1m没有此城市或者输入错误!\033[1m")
time.sleep(1)#等待时间
else:#输入错误提示并刷新城市列表
del city_list[:]
print("\033[31;1m没有此城市或者输入错误!\033[1m")
time.sleep(1)

完美实现

python三级菜单的实现的更多相关文章

  1. python三级菜单实例(傻瓜版和进阶版)

    程序: python三级菜单 要求: : 1.打印省.市.县三级菜单 2.可返回上一级 3.可随时退出程序 方案一:傻瓜版(其实傻瓜版考察的主要是思路!思路清楚了,那才不是傻瓜!O(∩_∩)O哈哈~) ...

  2. python(5)- 简单练习:python三级菜单优化

    python三级菜单优化,菜鸟版链接:http://www.cnblogs.com/xuyaping/p/6648170.html menu = { '北京':{ '海淀':{ '五道口':{ 'so ...

  3. python 三级菜单 while循环三次,湖北省市-县-街道的选择,3个while的循环 -day2

    python编写一个三级while的循环菜单 1.定义字典,字典里面嵌套字典,内嵌字典的值为列表. 思路: 湖北省的市:字典中的定义3个字典,用于存储{序列-键:市名} shiqu_dir = {} ...

  4. Python 三级菜单 增强版

    需要实现的功能是:三级菜单1.从文本内读出选项2.查询每一级的选项,并能对选项进行增/删/改功能3.每一级可以退出程序或者返回上一层 2018-5-14 更新内容 思路 实现过程中的BUG及解决方案: ...

  5. python三级菜单

    #-*- coding:utf-8 -*-#Author:gxli #一级菜单项def menu(): #遍历字典dic一级菜单 print('-----------一级菜单------------- ...

  6. Python 三级菜单与优化(一层循环嵌套)

    优化的思路是使用单层循环嵌套完成三级菜单,这个优化思路我非常喜欢,我喜欢在编程的时候用最少的东西写出同样的效果,通常这样会绕来绕去,但非常有趣!!! 需求: 1.运行程序输出第一级菜单: 2.选择一级 ...

  7. Python——三级菜单

    #三级菜单函数 menu = { '北京':{ 海淀:{ '五道口':{} '中关村':{} '上帝':{} } '昌平':{} '朝阳':{} '东城':{} }, '上海':{} '山东':{} ...

  8. 4th,Python三级菜单

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

  9. [terry笔记]python三级菜单

    把三级菜单输出,选择后逐层显示,”b“返回上一级菜单. menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村': ...

随机推荐

  1. Windows下Apache+Tomcat+jsp+php的服务器整合配置经验总结

    对于Apache+Tomcat+jsp+php的整合,针对不同的Tomcat和apache的版本,稍微有些区别. 一.所需软件 (1)JDK: jdk-7u15-windows-x64.exejdk的 ...

  2. 常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES

    1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...

  3. Linux内核分析:页回收导致的cpu load瞬间飙高的问题分析与思考--------------蘑菇街技术博客

    http://mogu.io/156-156 摘要 本文一是为了讨论在Linux系统出现问题时我们能够借助哪些工具去协助分析,二是讨论出现问题时大致的可能点以及思路,三是希望能给应用层开发团队介绍一些 ...

  4. MySQL主主复制+LVS+Keepalived实现MySQL高可用性1

    http://bestvivi.com/2015/09/09/MySQL%E4%B8%BB%E4%B8%BB%E5%A4%8D%E5%88%B6+LVS+Keepalived%E5%AE%9E%E7% ...

  5. 读书笔记-详解C程序开发中 .c和.h文件的区别

    一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ...

  6. UNIX线程之间的关系

    我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下. 1.  主线程等待新线程先结束退出,主线程后退出.正常执行. 示例代码: #include & ...

  7. CentOS 6.4安装OpenOffice

    终端依次输入: (1)sudo yum install openoffice.org-writer (2) sudo  yum install openoffice.org-calc (3) sudo ...

  8. Use excel Macro export data from database

    Sub DownLoadMacro() '定义过程名称 Dim i As Integer, j As Integer, sht As Worksheet 'i,j为整数变量:sht 为excel工作表 ...

  9. 如何恢复oracle中已删除的表

    在9i中Oracle引入了flashback的概念,可以将数据返回到某个时间点,但对于诸如drop/truncate等DDL语句却尚不支持.进入Oracle10g,这一缺陷得到了弥补.可以将丢失掉的表 ...

  10. NSArray 常用的一些方法

    - (NSUInteger) count; 返回数组中元素个数 - (id)objectAtIndex:(NSUInteger)index; 返回一个id类型的数组指定位置元素 - (id)lastO ...