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

Posted come-on-baby

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用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

执行结果如下图所示:

技术分享图片

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

 

 

 

  

以上是关于用Python写三级菜单的三个版本的主要内容,如果未能解决你的问题,请参考以下文章

原生的三级联动下拉框

Python程序练习2--模拟三级菜单

python实例_三级菜单

ajax实现三级联动下拉菜单

新手小白 python之路 Day1 (三级菜单功能实现)

遍历三级菜单--牛掰版本