python三級菜單

需求:

編寫三級菜單
    1.菜單需求:
        一級菜單:            北京                                  山西
        二級菜單:    朝陽                昌平               長治           大同
        三級菜單:三里屯    工體       沙河  西二旗       潞城  黎城     陽高縣  左雲縣
    2.任何一級都可以輸入b返回上一級,輸入q退出。
    3.知識涵蓋字典、列表、for循環、while循環、字符串格式化

流程圖:

wKiom1k2dNaBu5xfAAC5w97DPXA278.png-wh_50

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")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章