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