今天是一个坎,在做三级菜单时卡住了,因为想要简洁的代码,就要用到递归函数,卡的不要不要的!不过最后在同学老师的提点帮助下,还是解决了!

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第四天 三级菜单新思路的更多相关文章

  1. Python进阶实战之三级菜单

    目录 一.Python进阶实战之三级菜单 1.1 面条版 1.2 文艺青年版 一.Python进阶实战之三级菜单 打印省.市.县三级菜单 可返回上一级 可随时退出程序 1.1 面条版 menu = { ...

  2. Python学习之编写三级菜单(Day1,作业二)

    作业二:多级菜单 三级菜单 可依次进入各子菜单 在各级菜单中输入B返回上一级Q退出程序 知识点:字典的操作,while循环,for循环,if判断 思路: 1.开始,打印一级菜单让用户进行选择(可以输入 ...

  3. python基础之省份三级菜单

    菜单 menu = { #定义一个字典 '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家 ...

  4. Python实现简单的三级菜单

    话不多说,直奔代码 # 要处理的字典 dic1 = { '北京': { '东城': { '沙河': ['沙河机场', '链家'], '天通苑': ['北方明珠', '天通尾货'] }, '朝阳': { ...

  5. python入门编程之三级菜单编程

    菜单实现功能输入一层显示下一层菜单不论在哪层输入b返回上一层不论在哪层输入q退出菜单此代码通过利用字典的知识可以实现_Author_ = 'jc'data = { '北京':{ '昌平':{ '沙河' ...

  6. Python之路-(三级菜单)

    data = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, 'youk ...

  7. Python学习5,三级菜单实例

    _author_ = "Happyboy" data = { '北京':{ "昌平":{ "沙河":["Happyboy" ...

  8. Python学习之字典--三级菜单

    效果图: 实现代码: dic = { '人物':{ '帽子':{'前年玄铁帽'}, '武器':{'屠龙宝刀'} }, '属性':{ '力量':{35}, '敏捷':{66} }, '任务':{ '主线 ...

  9. python三级菜单的实现

    一.作业要求 1.使用字典实现三级菜单功能 2.直接输入前面数字进入下一级菜单 3.按B返回上一级,按Q退出 二.需要知识点 1.if循环 2.for循环,enumerate的用法 3.while循环 ...

随机推荐

  1. Python函数学习——匿名函数

    匿名函数 匿名函数就是不需要显式的指定函数名. 关键字lambda表示匿名函数,冒号前面的n表示函数参数,可以有多个参数. 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达 ...

  2. Java高并发之设计模式

    本文主要讲解几种常见并行模式, 具体目录结构如下图. 单例 单例是最常见的一种设计模式, 一般用于全局对象管理, 比如xml配置读写之类的. 一般分为懒汉式, 饿汉式. 懒汉式: 方法上加synchr ...

  3. html和body的关系

    1.chrome浏览器 从上面数据我们可以看出,html作为body的容器,其大小就是我们可视窗口的大小,window.innerHeight与html的clientHeight相同即可验证. 同时, ...

  4. python中selenium操作下拉滚动条方法汇总

    UI自动化中经常会遇到元素识别不到,找不到的问题,原因有很多,比如不在iframe里,xpath或id写错了等等:但有一种是在当前显示的页面元素不可见,拖动下拉条后元素就出来了. 比如下面这样一个网页 ...

  5. table滑块

    我们做table时,常常想做一个滑块的移动效果,来让app显得更加生动,原理很简单,废话不说,直接上code public class AnimationActivity extends AppCom ...

  6. 精读JavaScript模式(六),Memoization模式与函数柯里化的应用

    假期就这么结束了!十天假就有三天在路上,真的难受!想想假期除了看了两场电影貌似也没做什么深刻印象的事情.流浪地球,特效还是很赞,不过对于感情的描写还是逃不掉拖沓和尴尬的通病,对于国产科幻还是抱有支持的 ...

  7. 3分钟看完Java 8——史上最强Java 8新特性总结之第三篇 函数式编程技巧

    目录 · 改写设计模式 · 策略模式(Strategy Pattern) · 模板方法模式(Template Method Pattern) · 观察者模式(Observer Pattern) · 责 ...

  8. 来自于一个问题的回答对自己的反思 php怎么发送邮件?发送邮件插件PHPMailer

    前言: 昨天用手机无意点了一下博问,看见了一个朋友问了一个关于php发邮件不能添加发件人名称的问题,试着看了一下代码,觉得自己发现了问题所在,谁知道只是一知半解没有真正发现问题所在,看来有一段时间没有 ...

  9. kali网卡配置文件

    kali的网卡配置文件为/etc/network/interfaces 下面定义了lo.eth0和eth1的配置 auto lo # auto表示开机启动该网卡设备 iface lo inet loo ...

  10. 初识SqlLite ---.net连接数据库

    Sqlite 是一款轻量级的关系型数据库,以小巧和嵌入式闻名.以前只是听说,现在终于忍不住要尝试下.本文的初衷是为.net平台的使用者提供帮助. Sqlite有专门为VS2010开发的程序包,大家可以 ...