学习了while if for 等循环语句以及 字典、列表、字符串的基础知识后可以尝试做一下下面这个习题:

制作一个三级菜单,一级菜单为 3个省,二级菜单分别为该省下的3个市,三级菜单为该市下的几个县,要求程序开始时显示省的名称,输入名称显示该省下的市的名称,输入市后显示该市下的县的名称,直至输入县正确打印已到达该县,并且随时输入 quit 程序退出,输入 up 回到上级菜单输错了进行提示并重新输入。

我的思路是首先创造一个大字典,通过多层嵌套的方法把三级菜单涉及的省市县添加其中,通过while和if循环达到多层菜单的目的。

map = {
    '辽宁':{'沈阳':['新民','辽中','辽阳','大民屯'],'大连':['车家村','星海']},
    '吉林':{'通化':['快大','新宾','李家堡','王沟'],'敦化':['大石头','增益','西山']},
    '新疆':{'阿克苏':['库车','库尔勒','栏杆村'],'乌鲁木齐':['昌吉','血站']}
}

while 1:
    flag = 1
    province = input('请输入要前往的省份\n %s :' %(list(map.keys())))
    if (str(province) in map.keys()):
        while flag ==1:
            city = input('请输入要前往的市\n回到上层菜单请输入 up\n %s :' % (list(map[province].keys())))
            while city != 'up':
                if (str(city) in map[province].keys()):
                    county = input('请输入要前往的县\n回到上层菜单请输入 up\n %s :' % (list(map[province][city])))
                    if county != 'up':
                        if (str(county) in map[province][city]):
                            print('好的!您已到达%s县啦' % county)
                            city = 'quit'
                            province = 'quit'
                            flag =0
                            break
                        elif county == 'quit':
                            city = 'quit'
                            province = 'quit'
                            flag = 0
                            break
                        else:
                            print('请输入正确的县!')
                    else:
                        flag = 1
                        break
                elif city == 'quit':
                    province = 'quit'
                    flag = 0
                    break
                else:
                    print('请输入正确的城市!')
                if city == 'quit':
                    province = 'quit'
                    flag = 0
                    break
            flag = 0
    elif province == 'quit':
        break
    else:
        print('请输入正确的省份!')
    if province == 'quit':
        break

通过把字典元素加入到input函数中减少了代码行数,不过也导致标志位较多,应该还可以精简,可以作为以后的课题。

经过一天的研习,我发现这代码完全可以再次精简,首先上面的代码可以把每次的输入变量定为一个,然后仅用一个标志位就可以了。

然后我发现竟然还可以精简!!,将3次循环的三级登录转为一级循环,具体代码如下:

map = {
    '辽宁':{
        '沈阳':{
            '新民':{},
            '辽中':{},
            '辽阳':{},
            '大民屯':{}
        },
        '大连':{
            '车家村':{},
            '星海':{}
        }
    },
    '吉林':{
        '通化':{
            '快大':{},
            '新宾':{},
            '李家堡':{},
            '王沟':{}
        },
        '敦化':{
            '大石头':{},
            '增益':{},
            '西山':{}
        }
    },
    '新疆':{
        '阿克苏':{
            '库车':{},
            '库尔勒':{},
            '栏杆村':{}
        },
        '乌鲁木齐':{'昌吉':{},
                '血站':{}
                }
    }
}
layer = map

while True :
    # choice = input('>>>:%s'% list(layer.keys()))
    for key in layer:print(key,end='')
    choice = input('>>>: ').strip()
    if choice in layer:
        layer_backup = layer
        layer=layer[choice]
    elif choice == 'q':
        break
    elif choice == 'b':
        layer = layer_backup
    else:
        print('请输入正确的!')

这样就仅用12行代码解决了

上面的经过检查发现返回只能返回一次,后来研究出了这样的办法,把layer加到一个列表里,通过append 和pop就可以实现多层菜单了

调整为

layer = map
layer_backup=[]
while True :
    # choice = input('>>>:%s'% list(layer.keys()))
    for key in layer:print(key,end='')
    choice = input('>>>: ').strip()
    if choice in layer:
        layer_backup.append(layer)
        layer=layer[choice]
    elif choice == 'q':
        break
    elif choice == 'b':
        layer = layer_backup.pop()
    else:
        print('请输入正确的!')