欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

day21 04 三级菜单

程序员文章站 2022-03-25 19:12:24
day21 04 三级菜单 对每次用户输入与调用进行详细展开分析: 运行结果: 其中比较绕的地方就是当用户输入b和q的时候了: 用户输入b 返回上一级菜单:利用给调用的地方(上一级菜单)返回一个值b,然后结束语句,就在上一级继续循环 用户输入q 退出程序:通过一层一层的返回q值,知道退出程序 2.使 ......

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)  #1. 打印 北京 上海 山东
        key=input('input>>').strip() #2. 用户输入 北京 上海 山东 其中一个,假设输入北京
        #6.用户输入 打印 海淀 昌平 朝阳 东城 其中一个,假设输入昌平
        if key=='b' or key=='q':return key
        elif key in dic.keys() and dic[key]: #3. 输入的key在字典里面,且字典不为空
            ret=threelm(dic[key]) #4. 再次调用函数,把输入的字典传进去,比如输入北京则将   #18  接收#17返回的q ret=q
            # {'海淀':{'a':{},'b':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}}
            # 这个字典传进去,再次循环
            if ret=='q':return 'q'  #19 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]: #7. 输入的key在字典里面,且字典不为空
            ret=threelm(dic[key])#8. 再次调用函数,把输入的字典{'沙河':{},'天通苑':{},'回龙观':{}}传进去,再次循环
                                 #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() #10. 假设用户输入的是b  #14  假设用户在这里输入q
        if key=='b' or key=='q':return key #11. return b 给前面调用的地方即‘#8’的地方  #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-1\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 0

 

其中比较绕的地方就是当用户输入b和q的时候了:

用户输入b----返回上一级菜单:利用给调用的地方(上一级菜单)返回一个值b,然后结束语句,就在上一级继续循环

用户输入q----退出程序:通过一层一层的返回q值,知道退出程序

 

2.使用堆栈的方法  

代码如下:

 

menu={'北京':{'海淀':{'a':{},'h':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}}
    ,'上海':{'闵行':{'d':{},'f':{},'g':{}},'阐北':{},'浦东':{}}
    ,'山东':{}}
l=[menu] #首先有一个栈
while true:
    for key in l[-1]:print(key)#l[-1]是最后一个值,从最后一个开始打印,先进后出 l[-1]=menu 打印北京 上海 山东
    k=input('input>>').strip() #用户输入北京
    if k in l[-1].keys() and l[-1][key]:#判断输入的在不再字典当中以及是不是为空,如果为真执行下面的代码
        l.append(l[-1][k]) #将北京的字典放入l中,此时l=[menu,{海淀。。。。}],再while true 循环,又取的最后一个
        #如果知道这里已经可以进去了,但是出不去
    elif k=='b':
        l.pop() #把这一级菜单删除,直接就返回上级菜单
    elif k=='q':break #用户输入q退出程序
    else:continue

运行结果:

c:\users\sku1-1\pycharmprojects\untitled\venv\scripts\python.exe c:/users/sku1-1/pycharmprojects/untitled/三级菜单.py
山东
北京
上海
input>>北京
东城
昌平
朝阳
海淀
input>>昌平
沙河
天通苑
回龙观
input>>b
东城
昌平
朝阳
海淀
input>>q

process finished with exit code 0

 返回上一级菜单所作的操作:把原来所在的本级菜单直接删除,就剩下上一级菜单了