python第四天 三级菜单新思路
今天是一个坎,在做三级菜单时卡住了,因为想要简洁的代码,就要用到递归函数,卡的不要不要的!不过最后在同学老师的提点帮助下,还是解决了!
2017-5-10发现之前的代码有BUG今天 修改了!
作业要求:
三级菜单:
1. 运行程序输出第一级菜单
2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单
3. 菜单数据保存在文件中
文件操作还没有学到,暂时做到1,2两点,第3点明后天补上!
照旧,先上一下流程图:

详细代码:
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
menu_file=open("menu.txt",'r',encoding='utf-8')#打开菜单文件
info=eval(menu_file.readline())#转换菜单文件中的字符串
global conut,_tab,exit_flag _tab='\t\t' exit_flag = True
def menu_open(info):#递归函数 传入下一层菜单
global exit_flag,conut#声明全局变量
exit_flag=True#先为真
while exit_flag:
conut+=1
_tab2=_tab.expandtabs(tabsize=(conut*3))#为了增加菜单的可读性,按层级来加tab键
for i in info:
print(_tab2,i)
if conut==4:
name=input("当前为第\033[35;1m%s\033[0m是最后一层 按B/b返回<<< 按Q/q退出:"%conut)
name=name.strip()
if name=='b' or name=='B':
conut-=2#因数进行循环就加一,所以需要减2
break
elif name=='Q' or name=='q':
print("你已经退出菜单!")
exit_flag=False
break
else:
conut-=1
print("你输入的目录不存在!")
continue
if conut<4:#判断菜单层级不是最底层加一
name=input("当前为第 \033[32;1m%s\033[0m 层,请输入名称进入下一层>>> 按B/b返回<<< 按Q/q退出:"% conut)
name=name.strip()
if name=='b' or name=='B':
conut-=2#因数进行循环就加一,所以需要减2
break
elif name=='Q' or name=='q':
print("你已经退出菜单!")
exit_flag=False
break
elif name in info:#如果存在并不是最后一层则调用函数
menu_open(info[name])
else:
conut-=1
print("你输入的目录不存在!")
continue while exit_flag:
for i in info:
print(i)
conut=1
name=input("当前为第\033[32;1m %s\033[0m 层,请输入名称进入下一层>>> 按Q/q退出:"%conut)
name=name.strip()
if name=='Q' or name=='q':
print("你已经退出菜单!")
exit_flag=False
elif name in info: menu_open(info[name])
else:
print("你输入的目录不存在!")
continue
菜单内容比较少,将就着吧,回头有空再让它丰满起来!
#以下代码复制到python(3.6.2rc2)下 按F5 可以正常执行,对比学习。#QQ:124111294欢迎交流py
#三级菜单
menu = {
'北京':{
'海淀':{
'五道口':{
'soho':{},
'网易':{},
'google':{}
},
'中关村':{
'爱奇艺':{},
'汽车之家':{},
'youku':{},
},
'上地':{
'百度':{},
},
},
'昌平':{
'沙河':{
'老男孩':{},
'北航':{},
},
'天通苑':{},
'回龙观':{},
},
'朝阳':{},
'东城':{},
},
'上海':{
'闵行':{
"人民广场":{
'炸鸡店':{}
}
},
'闸北':{
'火车战':{
'携程':{}
}
},
'浦东':{},
},
'山东':{},
} # while not exit_flag <如果条件为假执行循环>
# for k in current_layer <条件循环>
# print(k) <打印>
# input<输入>
# .strip()#strip([chars]) <删除字符串前边和后边所有的空格,chars参数可以指定删除的字符,可选>
# if <条件判断>
# layers.pop() <删除>
# elif choice not in <条件判断>
# continue <跳出本次循环,重新循环>
# else <否则,当if条件不成立时执行>
# .append<附加>
# choice<选择> exit_flag = False
current_layer = menu layers = [menu] while not exit_flag:
for k in current_layer:
print(k)
choice = input(">>:").strip()
if choice == "b":
current_layer = layers[-1]
#print("change to laster", current_layer)
layers.pop()
elif choice not in current_layer:continue
else:
layers.append(current_layer)
current_layer = current_layer[choice] #以下代码复制到python(3.6.2rc2)下 按F5 可以正常执行,对比学习。QQ:124111294欢迎交流py
三级菜单新思路
python第四天 三级菜单新思路的更多相关文章
- Python进阶实战之三级菜单
目录 一.Python进阶实战之三级菜单 1.1 面条版 1.2 文艺青年版 一.Python进阶实战之三级菜单 打印省.市.县三级菜单 可返回上一级 可随时退出程序 1.1 面条版 menu = { ...
- Python学习之编写三级菜单(Day1,作业二)
作业二:多级菜单 三级菜单 可依次进入各子菜单 在各级菜单中输入B返回上一级Q退出程序 知识点:字典的操作,while循环,for循环,if判断 思路: 1.开始,打印一级菜单让用户进行选择(可以输入 ...
- python基础之省份三级菜单
菜单 menu = { #定义一个字典 '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家 ...
- Python实现简单的三级菜单
话不多说,直奔代码 # 要处理的字典 dic1 = { '北京': { '东城': { '沙河': ['沙河机场', '链家'], '天通苑': ['北方明珠', '天通尾货'] }, '朝阳': { ...
- python入门编程之三级菜单编程
菜单实现功能输入一层显示下一层菜单不论在哪层输入b返回上一层不论在哪层输入q退出菜单此代码通过利用字典的知识可以实现_Author_ = 'jc'data = { '北京':{ '昌平':{ '沙河' ...
- Python之路-(三级菜单)
data = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, 'youk ...
- Python学习5,三级菜单实例
_author_ = "Happyboy" data = { '北京':{ "昌平":{ "沙河":["Happyboy" ...
- Python学习之字典--三级菜单
效果图: 实现代码: dic = { '人物':{ '帽子':{'前年玄铁帽'}, '武器':{'屠龙宝刀'} }, '属性':{ '力量':{35}, '敏捷':{66} }, '任务':{ '主线 ...
- python三级菜单的实现
一.作业要求 1.使用字典实现三级菜单功能 2.直接输入前面数字进入下一级菜单 3.按B返回上一级,按Q退出 二.需要知识点 1.if循环 2.for循环,enumerate的用法 3.while循环 ...
随机推荐
- Hadoop社区版搭建
1.环境准备 1.1 硬件配置 设备名 参数 数量 6台 系统 centos6.5 内存 64G 硬盘 32T/台 CPU 16核/台 1.2 软件版本 Hadoop-2.x 下载地址 JDK1.7 ...
- 在Kubernetes中部署GlusterFS+Heketi
目录 简介 Gluster-Kubernetes 部署 环境准备 下载相关文件 部署glusterfs 部署heketi server端 配置heketi client 简介 在上一篇<独立部署 ...
- mysql 开发进阶篇系列 25 数据库RPM安装目录介绍
一.概述 mysql可以在多个平台上运行,在windows平台上安装有noinstall包和图形化包二种方式.在linux/unix平台上有RPM包安装,二进制包(Binary Package)安装, ...
- Shell脚本 | 截取包名
之前写 shell 脚本的几篇文章都是先大致介绍脚本的功能和写法,然后一股脑的给出完整的代码.并没有细致入微的解释脚本中的每一行是如何思考如何编写的. 今天反其道而行之,只介绍一行代码.争取能讲的清楚 ...
- 和我一起打造个简单搜索之SpringDataElasticSearch关键词高亮
前面几篇文章详细讲解了 ElasticSearch 的搭建以及使用 SpringDataElasticSearch 来完成搜索查询,但是搜索一般都会有搜索关键字高亮的功能,今天我们把它给加上. 系列文 ...
- 简明awk教程(Simple awk tutorial)
整理翻译.原文地址:http://www.hcs.harvard.edu/~dholland/computers/awk.html 简明awk教程 为什么选awk? awk小巧.快速.简单.awk语言 ...
- java使用java.lang.management监视和管理 Java 虚拟机
ClassLoadingMXBean 用于 Java 虚拟机的类加载系统的管理接口. CompilationMXBean 用于 Java 虚拟机的编译系统的管理接口. GarbageCollector ...
- linux上可代替ftp的工具rz和sz
对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / sz命令很方便的帮我们实现了这个功能,但是很多Linux系统初始并没有这两个命令,因此简单的 ...
- OpenCV3三种超像素分割算法源码以及效果
OpenCV3中超像素分割算法SEEDS,SLIC, LSC算法在Contrib包里,需要使用Cmake编译使用.为了方便起见,我将三种算法的源码文件从contrib包里拎了出来,可以直接使用,顺便比 ...
- 【学习笔记】深入理解async/await
参考资料:理解javaScript中的async/await,感谢原文作者的总结,本文在理解的基础上做了一点小小的修改,主要为了加深自己的知识点掌握 学完了Promise,我们知道可以用then链来解 ...