Python攻克之路-三级菜单(优化版本)

三级菜单优化版本
描述:三级的代码基本都是一样的,只有进入不同的层是不一样的,每次循环时让它自身知道去记录那一层就可以了

menu = { ... }

1. 设置一个变量来记录当前层,循环时,只循环current_layer,不循环menu这个字典,因为current_layer是可以随时改变的,第一次循环时把整个字典meun赋值给current_layer,第二次循环时把menu字典下的beijing赋值给它,相当于循环beijing,第三次循环时把changping赋值给它

current_layer = menu                #第一次循环是menu
while True:
    for key in current_layer:       ##直接循环第一层
        print(key)
    choice = input(">>>  ").strip()
    if len(choice) == 0:continue    ##如果用户输入的长度为0,就要让它重新再输入,continue继续

  

2. 对用户输入的进行判断是否在菜单里,不用再打印,让它利用上一次的循环进入到下一层

    if choice in current_layer:
        current_layer = current_layer[choice]  #current_layer是动态的变量,可以是第二层,可以是第三层
    else:
        print('Not exist')

  

3.回退功能的实现,现在问题是通每层的父层找到下一层,程序无法通过子层找到父层,但是可以要每进入下一层之前,把父层记录下来parent_layer = menu,最开始的状态是menu

    if choice in current_layer:
        parent_layer = current_layer           ##因为输入choice后,马上就进入下一层,这里直接记录现在所在层
        current_layer = current_layer[choice]  ##进入到子层,只是等于子层,要回到最上代码for key in current_layer:才给用户选择
    elif choice == 'b':
        current_layer = parent_layer           ##刚才记录是父层,所以回退时直接等于parent_layer

注意:parent_layer = current_layer 时,有个问题,记录父级时,从父层进入子层,是可以实现,但是再进入子层,这时记录的就把上次的值覆盖

 

4.解决parent_layer只记录一层的问题,如果使用字典会涉及那个是键,那个是值的问题,所以使用列表来实现,如[1,2,3],每一层相当于存它的父层,如进入第1层就是存第1层,进入第3层时要存第2层,如果要返回只是取最后一个值就可以,进入第4层就记录第三层,直接把3这个值取出来就行

  parent_layers = []        #全局中定义一个空格列表,保存所有父层,最后一个元素永远都是父级
      if choice in current_layer:
        parent_layers.append(current_layer)          ##修改成,每进入下一层,就追加现在,也就是下一层的父层
        current_layer = current_layer[choice]
    elif choice == 'b':
        if parent_layers:                          ##本身定义是空,这里如果为空就false就不会再执行pop,以避免退出最后一层时报错
            current_layer = parent_layers.pop()          ##返回到上层就弹出一个值

  

 完整代码

menu = {
   'Beijing':{
      'Chaoyang':{
         'Guomao':{
            'CICC':{},
            'HP':{},
            'Zadayinhang':{},
            'CCTV':{},
         },
         'Wangjing':{
            'Momo':{},
            'Benz':{},
            '360':{},
         },
         'Sanlitun':{
            'Youyiku':{},
            'apple':{},
         },
      },
      'Changping':{
         'Shahe':{
            'Etiantian':{},
            'Atai':{},
         },
         'Tiantongyan':{
            'Lianjia':{},
            'Woaiwojia':{},
         },
         'Huilongguan':{},
      },
      'Haidian':{
         'Wudaokou':{
            'Google':{},
            'Wangyi':{},
            'Shouhu':{},
            'Sogu':{},
            'Kuaishou':{},
         },
         "Zhongguancun":{
            'Youku':{},
            'Iqiyi':{},
            'Qichezhijia':{},
            'Xindongfang':{},
            'qq':{},
         }
      },
   },
   'Shanghai':{
      'Budong':{
         'Lujia':{
            'CICC':{},
            'Gaosheng':{},
            'Mogeng':{},
         },

         'Waitang':{},
      },
      'Minhang':{},
      'Jingan':{},
   },
   'Shandong':{
      'Jinan':{},
      'Dezhou':{
         'Leling':{
            'Dingwuzhen':{},
            'Chenqu':{},
         },
         'Pingyuan':{},
      },
      'Qindao':{},
   },
}
View Code
#!/usr/local/python3/bin/python3
#
menu = { ... }
current_layer = menu
parent_layers = [] 
while True:
    for key in current_layer:
        print(key)
    choice = input(">>>  ").strip()
    if len(choice) == 0:continue
    if choice in current_layer:
        parent_layers.append(current_layer)
        current_layer = current_layer[choice]
    elif choice == 'b':
        if parent_layers:
            current_layer = parent_layers.pop()
    else:
        print('Not exist')

 

posted @ 2018-02-25 19:09  Reid21  阅读(193)  评论(0)    收藏  举报