python学习笔记 day21 三级菜单

1.递归实现三级菜单:

menu={
    '河南':{
        '商丘':{
            '夏邑':{},
            '县1':{}
               },
        '郑州':{
            '县1':{},
            '县2':{}
                },
        '开封':{
            '县1':{},
            '县2':{}
               }
            },
    '吉林':{
        '市1':{
            '县1':{},
            '县2':{}
              },
        '市2':{
            '县1':{},
            '县2':{}
               }
            },
    '厦门': {
        '市1': {
            '县1': {},
            '县2': {}
               },
        '市2': {
            '县1': {},
            '县2': {}
               }
            }
    }
def func(menu):
    while True:  # 每一个菜单都可以被反复输出,执行
        for key in menu:
            print(key)  # 对于进到的每一级菜单都进行输出该级菜单名称
        k=input(">>>")  
        if k in menu and menu[k]:  # 如果输入的菜单名 在字典中,并且key对应的value 是有值的
            ret=func(menu[k])      # 就不断递归调用下一级菜单 然后我们再去这个函数从头到尾再执行一遍,然后打印该级别菜单名字 重新输入,要进入哪一级菜单
            if ret == 'q':         # 如果这时候不想继续进入下一级菜单,q 的话 就要退出该级菜单,该级菜单的函数执行就得结束,但是得告诉上一级函数,我不想执行了,返回一个标志,让上一级函数去处理
                break
            elif ret=='b':         # 如果该下级菜单k输入的是b 就是不想继续进入下级菜单,想要返回,那该级菜单函数也不要继续执行了,得return 然后给上一级函数一个标志b 这里continue 当上层函数收到ret=b 时就会继续在该层函数不断执行                  
                continue
        elif k=='b' or k=='q':
            return k               # 这是针对下一级菜单的,如果输入k= b or q 函数就不要再继续执行了,只需要给上层函数返回个标志
        else:
            continue               # 当一直进入下一级菜单,直到该层菜单无法继续进入menu[k]为{} 这时 就在该层不断循环,提示用户输入,而不再递归调用下层函数(因为没有了)
            

func(menu)

运行结果:

2. 堆栈实现(不用递归)实现三级菜单

menu={
    '河南':{
        '商丘':{
            '夏邑':{},
            '县1':{}
               },
        '郑州':{
            '县1':{},
            '县2':{}
                },
        '开封':{
            '县1':{},
            '县2':{}
               }
            },
    '吉林':{
        '市1':{
            '县1':{},
            '县2':{}
              },
        '市2':{
            '县1':{},
            '县2':{}
               }
            },
    '厦门': {
        '市1': {
            '县1': {},
            '县2': {}
               },
        '市2': {
            '县1': {},
            '县2': {}
               }
            }
    }

L=[menu]
while L:
    for key in L[-1]:
        print(key)
    k=input('>>>')
    if k in L[-1].keys() and L[-1][k]:   # 如果输入的名字在该级菜单中,并且下一级菜单有值
        L.append(L[-1][k])   # 就把下一级菜单加入L列表,等下一次循环,拿到的key就是这个新的菜单列表了,因为append,L[-1]刚好取最新的一级菜单
    elif k=='b':  # 如果输入的是b 就是退回上一级菜单,只需要把现在L列表中最新的这个下级菜单删掉就行了
        L.pop()
    elif k=='q':  # 如果是q 就直接退出就好了
        break

运行结果:

talk is cheap,show me the code
原文地址:https://www.cnblogs.com/xuanxuanlove/p/9657251.html