• 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
  • 相关阅读:
    跟初学者学习IbatisNet第三篇
    跟初学者学习IbatisNet第二篇
    跟初学者学习IbatisNet第一篇
    读书时如何做读书笔记
    CCNET+MSBuild+SVN实现每日构建
    WebApi 通过类名获取类并实例化
    HttpClient设置代理
    dotnet core命令行启动如何支持如何找到进程
    redis 在Windows下的安装及基本操作(更新中~~~)
    Spring实现IoC的多种方式
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9657251.html
Copyright © 2020-2023  润新知