day21 04 三级菜单
2024-08-30 20:40:41
day21 04 三级菜单
1.使用递归调用的方法 整体代码类型比较简单如下:
menu={'北京':{'海淀':{'a':{},'h':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}}
,'上海':{'闵行':{'d':{},'f':{},'g':{}},'阐北':{},'浦东':{}}
,'山东':{}}
l=[menu]
def threeLM(dic):
while True:
for key in dic:print(key)
key=input('input>>').strip()
if key=='b' or key=='q':return key
elif key in dic.keys() and dic[key]:
ret=threeLM(dic[key])
if ret=='q':return 'q'
threeLM(menu)
对每次用户输入与调用进行详细展开分析:
#第一次调用:dic=menu
def threeLM(dic):
while True:#进来就是死循环
for key in dic:print(key) #. 打印 北京 上海 山东
key=input('input>>').strip() #. 用户输入 北京 上海 山东 其中一个,假设输入北京
#.用户输入 打印 海淀 昌平 朝阳 东城 其中一个,假设输入昌平
if key=='b' or key=='q':return key
elif key in dic.keys() and dic[key]: #. 输入的key在字典里面,且字典不为空
ret=threeLM(dic[key]) #. 再次调用函数,把输入的字典传进去,比如输入北京则将 # 接收#17返回的q ret=q
# {'海淀':{'a':{},'b':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}}
# 这个字典传进去,再次循环
if ret=='q':return 'q' # return q 函数就结束了,所以用户输入q结果就是退出程序
threeLM(menu) #第二次调用:dic={'海淀':{'a':{},'b':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}}
def threeLM(dic):
while True:#进来就是死循环
for key in dic:print(key)
#5. 打印 海淀 昌平 朝阳 东城
#13 elif语句结束后 又开始循环,打印 海淀 昌平 朝阳 东城,所以#10的地方输入b结果就是返回上一级菜单
key=input('input>>').strip()
#6. 用户输入 打印 海淀 昌平 朝阳 东城 其中一个,假设输入昌平
if key=='b' or key=='q':return key
elif key in dic.keys() and dic[key]: #. 输入的key在字典里面,且字典不为空
ret=threeLM(dic[key])#. 再次调用函数,把输入的字典{'沙河':{},'天通苑':{},'回龙观':{}}传进去,再次循环
#12 接收#11返回的值,ret=b 不符合下面的if条件,所以elif语句结束了
#16 接收#15返回的值,ret=q 符合下面的if语句
if ret=='q':return 'q' #17 将q返回上个调用的地方,即#4的地方
threeLM(menu) #第三次调用:dic={'沙河':{},'天通苑':{},'回龙观':{}}
def threeLM(dic):
while True:#进来就是死循环
for key in dic:print(key)
#9. 打印 沙河 天通苑 回龙观
key=input('input>>').strip() #. 假设用户输入的是b #14 假设用户在这里输入q
if key=='b' or key=='q':return key #. return b 给前面调用的地方即‘#’的地方 #15 return q给前面调用的地方
elif key in dic.keys() and dic[key]:
ret=threeLM(dic[key])
if ret=='q':return 'q'
threeLM(menu)
运行结果:
C:\Users\sku1-\PycharmProjects\untitled\venv\Scripts\python.exe "C:/Users/sku1-1/PycharmProjects/untitled/day 21 04 三级菜单.py"
山东
北京
上海
input>>北京
昌平
海淀
东城
朝阳
input>>海淀
a
c
h
input>>b
昌平
海淀
东城
朝阳
input>>q Process finished with exit code
其中比较绕的地方就是当用户输入b和q的时候了:
用户输入b----返回上一级菜单:利用给调用的地方(上一级菜单)返回一个值b,然后结束语句,就在上一级继续循环
用户输入q----退出程序:通过一层一层的返回q值,知道退出程序
2.使用堆栈的方法
代码如下:
menu={'北京':{'海淀':{'a':{},'h':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}}
,'上海':{'闵行':{'d':{},'f':{},'g':{}},'阐北':{},'浦东':{}}
,'山东':{}}
l=[menu] #首先有一个栈
while True:
for key in l[-]:print(key)#l[-]是最后一个值,从最后一个开始打印,先进后出 l[-]=menu 打印北京 上海 山东
k=input('input>>').strip() #用户输入北京
if k in l[-].keys() and l[-][key]:#判断输入的在不再字典当中以及是不是为空,如果为真执行下面的代码
l.append(l[-][k]) #将北京的字典放入l中,此时l=[menu,{海淀。。。。}],再while True 循环,又取的最后一个
#如果知道这里已经可以进去了,但是出不去
elif k=='b':
l.pop() #把这一级菜单删除,直接就返回上级菜单
elif k=='q':break #用户输入q退出程序
else:continue
运行结果:
C:\Users\sku1-\PycharmProjects\untitled\venv\Scripts\python.exe C:/Users/sku1-/PycharmProjects/untitled/三级菜单.py
山东
北京
上海
input>>北京
东城
昌平
朝阳
海淀
input>>昌平
沙河
天通苑
回龙观
input>>b
东城
昌平
朝阳
海淀
input>>q Process finished with exit code
返回上一级菜单所作的操作:把原来所在的本级菜单直接删除,就剩下上一级菜单了
最新文章
- 因为多余jar包,所报的错
- OC----面向对象
- objective-c(接口&;实现)
- Android Library Project 使用问题总结
- spl_autoload_register更改框架文件引用模式
- ASP.NET页面生存周期
- AMAZON PRICE TRACKER, AMAZON PRICE HISTORY, AMAZON PRICE DROP ALERT | DROPGG.COM
- (转)兼容主流浏览器的CSS透明代码
- 类和ID选择器的区别
- Dhroid框架笔记(IOC、EventBus)
- No module named MYSQLdb 问题解决
- Python第三方库安装技巧
- windows 下面安装gcc
- CSS3 box-shadow 属性
- Web服务器原理
- python open()函数的模式选择
- vs 的git插件
- SSM简单整合教程&;测试事务
- h5的部分新元素或属性
- 关于一致性Hash算法
热门文章
- 关于element-ui的diallog拖动的实现
- shiro之SimpleAccountRealm
- Python上下文管理器(Context managers)
- 进击的Python【第十三章】:Web前端基础之HTML与CSS样式
- 洛谷 P3690 【模板】Link Cut Tree (动态树) || bzoj 3282: Tree
- 总结用CoreText绘制文本时遇到的问题以及解决办法
- NSoup获取网页源代码
- 配置Oracle监听器
- npm run dev报错--Error: Cannot find module 'yargs-parser'
- 希尔排序法及其js实现