码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-07-28 15:13:48      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:全局   方便   choice   lag   div   最好   代码   ==   als   

要求:

     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写三级菜单的三个版本

标签:全局   方便   choice   lag   div   最好   代码   ==   als   

原文地址:https://www.cnblogs.com/come-on-baby/p/9381753.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!