需求:

编写三级菜单
    1.菜单需求:
        一级菜单:            北京                                  山西
        二级菜单:    朝阳                昌平               长治           大同
        三级菜单:三里屯    工体       沙河  西二旗       潞城  黎城     阳高县  左云县
    2.任何一级都可以输入b返回上一级,输入q退出。
    3.知识涵盖字典、列表、for循环、while循环、字符串格式化

流程图:

python三级菜单_流程图

python代码

#!/bin/bash/env python
#python3.X

#定义三级菜单字典zone
zone = {
    '北京':{
        '朝阳':['三里屯','工体' ],
        '昌平':['沙河','西二旗' ]
    },
    '山西':{
        '长治':['潞城', '黎城' ],
        '大同':['阳高县','左云县']
    }
}
#定义省级列表
province_list = list(zone.keys())
#打印省级列表循环
while True:
    print("欢迎光临省级列表".center(20,'-'))
    #循环省级列表
    for i in province_list:
        #打印省级列表序号和省级名称
        print(province_list.index(i)+1,i)
    #提示输入
    p1 = input("请选择序号:例:1  [输入q:退出]")
    #判断输入的是否全是数字
    if p1.isdigit():
        #如果输入的是数字,用int进行强制转换成×××
        p1 = int(p1)
        #如果p1 大于0或者小于等于省级列表的参数数量
        if p1 >0 and p1 <= len(province_list):
            #求出省级名称
            province_name = province_list[p1-1]
            #求出省级下边的市级列表
            city_list = list(zone[province_name].keys())
            #打印市级列表循环
            while True:
                print("欢迎光临市级列表".center(20, '-'))
                #循环市级列表
                for c in city_list:
                    #打印市级列表序号和市级列表名称
                    print(city_list.index(c)+1,c)
                #提示输入
                c1 = input("请选择序号:例:1 [输入b:返回上一级][输入q:退出]")
                #判断是否输入的是数字
                if c1.isdigit():
                    c1 = int(c1)
                    #如果输入的序号在市级列表序列之内,打印列表,不在,告知不在。
                    if c1 >0 and c1 <= len(city_list):
                        #求出市级列表的名称
                        city_name = city_list[c1-1]
                        #求出市级下边的县级列表:
                        county_list = list(zone[province_name][city_name])
                        #县级列表循环
                        while True:
                            print("欢迎光临县级列表".center(20,"-"))
                            #循环县级列表
                            for c2 in county_list:
                                #打印县级列表
                                print(county_list.index(c2)+1,c2)
                            #提示输入
                            c2 = input("请输入相应符号:[输入b:返回上一级][输入q:退出]")
                            #如果输入是b 退出这个循环
                            if c2 == "b":
                                break
                            #如果输入的是q 退出整个循环
                            elif c2 == "q":
                                #exit() 代表退出整个循环
                                exit()
                            #如果输入的不是b、q 就提示重新输入
                            else:
                                print("\033[31m输入错误,Please re-enter!\033[0m")
                    else:
                        print("\n输入的序号%d不在此列表中!Please RE-enter!\n"%c1)
                #如果输入的是b 退出这个循环
                elif c1 == "b":
                    break
                #如果输入的是q 退出整个程序
                elif c1 == "q":
                    exit()
                #如果输入的不是数字、b 、q 那么提示 重新输入
                else:
                    print("\033[31m输入错误,Please re-enter!\033[0m")
        else:
            print("\n输入的%d不在此列表中!Please RE-enter!\n"%p1)
    #如果不是数字,看是否是 字母q
    elif p1 == "q":
        #如果是q 执行exit()退出整个程序
        exit()
    #如果输入的不是数字和q,提示重新输入
    else:
        print("\033[31m输入错误,Please re-enter!\033[0m")

三级菜单优化版:

#!/bin/bash/env python
# _*_ coding:utf-8 _*_
# python version: 3.x
# author: 506554897

'''
作业:三级菜单
数据结构:
menu = {
    '北京':{
        '海淀':{
            '五道口':{
                'soho':{},
                '网易':{},
                'google':{}
            },
            '中关村':{
                '爱奇艺':{},
                '汽车之家':{},
                '优酷':{},
            }
    },
    '上海':{
    }
}

需求:
可依次选择进入各子菜单
可从任意一层往回退到上一层
可从任意一层退出程序
'''
# 三级菜单
menu = {
    '北京': {
        '海淀': {
            '五道口': {
                'soho': {},
                '网易': {},
                'google': {}
            },
            '中关村': {
                '爱奇艺': {},
                '汽车之家': {},
                'youku': {},
            },
            '上地': {
                '百度': {},
                '腾讯': {}
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {
                '链家地产': {},
                '天兰尾货': {}
            },
            '回龙观': {
                'H3C': {},
                '积水潭医院': {}
            },
        },
    },
    '上海': {
        '闵行': {
            "人民广场": {
                '炸鸡店': {}
            }
        },
        '闸北': {
            '火车战': {
                '携程': {}
            }
        },
    }
}

# 定义全局变量
temp_menu_list = []         # 临时菜单列表(动态的)
current_menu_dic = menu     # 当前的菜单字典

count = 1       # 用于计算循环三层列表是否在 首层
# 进入菜单循环
while True:
    print("欢迎光临旅游之城".center(38, "-"))
    # 循环打印菜单列表
    for i in current_menu_dic:
        print(i)

    # 判断菜单列表是否在 首层
    if count == 1:
        user_change = input("请选择城市名称; 输入q退出:").strip()   # 菜单在首层,不打印返回b
    else:
        user_change = input("请选择城市名称; 输入q退出; 输入b返回上一级:").strip()

    # 判断用户选择的是否在菜单列表中
    if user_change in current_menu_dic:
        if len(current_menu_dic[user_change]) > 0:  # 判断菜单字典的 key值 有无value,无value说明到底层了
            temp_menu_list.insert(0, current_menu_dic)      # 将当前的菜单字典,加入到临时菜单列表,用于返回菜单使用
            current_menu_dic = current_menu_dic[user_change]    # 将用户选择后的菜单字典赋值给当前的菜单字典
            count += 1
        else:
            print("\033[31m已经是最底层了!\033[0m")    # 当前菜单字典的key值 无value 就打印已经是底层了

    # 当用户已经到达首层,还在输入b返回上一级,就告诉用户这已经是首层了
    elif user_change == "b" and count == 1:
        print("\033[31m已经是最首层了!\033[0m")
    # 当用户输入b 返回上一级菜单
    elif user_change == "b":
        current_menu_dic = temp_menu_list[0]    # 将上一级菜单字典 赋值给当前菜单字典,作为新的菜单
        temp_menu_list.pop(0)       # 在临时菜单列表中删除上一次循环change后的当前菜单字典
        count -= 1
    elif user_change == "q":
        print("谢谢光临旅游之城".center(38, "*"))
        exit()
    else:
        print("\033[31m输入错误 请重新输入!\033[0m")