zoukankan      html  css  js  c++  java
  • day21 04 三级菜单

    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:Userssku1-1PycharmProjectsuntitledvenvScriptspython.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:Userssku1-1PycharmProjectsuntitledvenvScriptspython.exe C:/Users/sku1-1/PycharmProjects/untitled/三级菜单.py
    山东
    北京
    上海
    input>>北京
    东城
    昌平
    朝阳
    海淀
    input>>昌平
    沙河
    天通苑
    回龙观
    input>>b
    东城
    昌平
    朝阳
    海淀
    input>>q
    
    Process finished with exit code 0

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

     
  • 相关阅读:
    visual studio 2019 sql server localdb 数据库中文乱码解决方法
    Ado.net总结
    Ado.Net总结
    提升DataGridView加载速度的三个属性设置
    winform程序:newtonsoft json 序列化时出现 “unterminated string. Excepted delimiter..."
    entityframewor core 不让属性生成数据库的列
    在winform中屏蔽双击最大化或最小化窗体(C#实现),禁用任务管理器结束程序
    使用cefsharp在winform中嵌套浏览器
    PIE SDK算法的同步调用
    PIE SDK小波变换
  • 原文地址:https://www.cnblogs.com/wxm422562/p/10822528.html
Copyright © 2011-2022 走看看