用Python写三级菜单的三个版本

要求:

     1.可以进入子菜单

     2.可以返回上一级

     3.可以从任意一级直接退出

基础版:(主要运用到了字典的读取)

#以字典的格式存放,方便调用
data={
    '河北':{
        '保定':{
            '曲阳':['燕赵','党城'],
            '阜平':['平阳','山子头']
        },
        '邢台':{
            '桥东区':['邢台学院','天一广场'],
            '桥西区':['北国商城','科技大厦']
        },
        '石家庄':{
            '裕华区':['河北科技大学','河北师范大学'],
            '长安区':['河北医科大学','河北地址大学']
        }
    },
    '北京':{
        '海淀':{
            '清华':['荷塘月色','牡丹园'],
            '北京大学':['博雅塔','未名湖']
        },
        '朝阳':{
            '中国传媒大学':['新闻','播音'],
            '北京工业大学':['计算机','软件工程']
        },
        '延庆':{
            '八达岭长城':['北长城','南长城'],
            '野生动物园':['老虎','狮子']
        }
    }
}
exit_flag=False #设置全局变量,用来退出循环,实现任意一级菜单都可以退出
while not exit_flag:
    for i1 in data:#读取第一级菜单
        print(i1)
    choice=input('选择进入1,第一级,按q退出')
    if choice in data:
        while not exit_flag:
            for i2 in data[choice]:#读取第二级菜单
                print(i2)
            choice2 = input('选择进入2,按b返回上一级,按q退出')
            if choice2 in data[choice]:
                while not exit_flag:
                    for i3 in data[choice][choice2]:#读取第三级菜单
                        print(i3)
                    choice3 = input('选择进入3,按b返回上一级,按q退出')
                    if choice3 in data[choice][choice2]:
                        for i4 in data[choice][choice2][choice3]:
                            print(i4)
                        choice4 = input('最后一层,按b返回上一级,按q退出')
                        if choice4=='b':
                            pass #占位符
                        if choice4 == 'q':
                            exit_flag = True
                    if choice3=='b':
                        break
                    if choice3 == 'q':
                        exit_flag = True
            if choice2=='b':
                break
            if choice2 == 'q':
                exit_flag = True
    if choice=='q':
        exit_flag=True

瑕疵版(主要运用了函数的递归调用,使用了global定义局部变量,这样定义的局部变量可以修改全局变量。不到万不得已,不可使用global)

exit_flag=False
#以字典的格式存放,方便调用
data={
    '河北':{
        '保定':{
            '曲阳':['燕赵','党城'],
            '阜平':['平阳','山子头']
        },
        '邢台':{
            '桥东区':['邢台学院','天一广场'],
            '桥西区':['北国商城','科技大厦']
        },
        '石家庄':{
            '裕华区':['河北科技大学','河北师范大学'],
            '长安区':['河北医科大学','河北地址大学']
        }
    },
    '北京':{
        '海淀':{
            '清华':['荷塘月色','牡丹园'],
            '北京大学':['博雅塔','未名湖']
        },
        '朝阳':{
            '中国传媒大学':['新闻','播音'],
            '北京工业大学':['计算机','软件工程']
        },
        '延庆':{
            '八达岭长城':['北长城','南长城'],
            '野生动物园':['老虎','狮子']
        }
    }
}
def func_choice(kwargs):
    '''函数说明'''
    global exit_flag #定义一个可以修改全局变量的局部变量,以便程序可以随时退出
    while not exit_flag:
        for i in kwargs:
            print(i)
        choice=input("选择进入,按b返回上一级,按q退出")
        if choice in kwargs:
            func_choice(kwargs[choice])#递归调用
        if choice=='q':
            exit_flag=True
        if choice=='b':
            break

func_choice(data)

     此版本中还要说明一点,虽然data的存储类型为字典,但是此字典中还嵌套了列表,所以在定义参数时,不能定义为(**kwargs),否则会出现以下错误:

成熟版(主要运用了列表。个人认为这个版本最好,代码简洁,利于理解)

exit_flag=False
#以字典的格式存放,方便调用
data={
    '河北':{
        '保定':{
            '曲阳':['燕赵','党城'],
            '阜平':['平阳','山子头']
        },
        '邢台':{
            '桥东区':['邢台学院','天一广场'],
            '桥西区':['北国商城','科技大厦']
        },
        '石家庄':{
            '裕华区':['河北科技大学','河北师范大学'],
            '长安区':['河北医科大学','河北地址大学']
        }
    },
    '北京':{
        '海淀':{
            '清华':['荷塘月色','牡丹园'],
            '北京大学':['博雅塔','未名湖']
        },
        '朝阳':{
            '中国传媒大学':['新闻','播音'],
            '北京工业大学':['计算机','软件工程']
        },
        '延庆':{
            '八达岭长城':['北长城','南长城'],
            '野生动物园':['老虎','狮子']
        }
    }
}
count=0
last_rank = []
while  not exit_flag:
    for i in data:
        print(i)
    if count==3:
        print("到达最后一层,按q退出,按b返回")
    elif count==0:
        print("当前是第一层,按q退出")
    else:
        print("当前为第%s层" % (count+1))
    choice = input('>:').strip()
    count+=1
    if choice in data:
        last_rank.append(data)  # 将当前菜单添加到列表(列表中的每一个元素为一个字典)
        data = data[choice]         # 进入下一层菜单
    elif choice == 'b':
        if len(last_rank) != 0:
            data = last_rank.pop()  # 删除列表最后一位元素,从而返回上一层
    elif choice == 'q':
        exit_flag = True

执行结果如下图所示:

欢迎各位大神测试并指正,谢谢!

  

猜你喜欢

转载自www.cnblogs.com/come-on-baby/p/9381753.html