作業二:多級菜單
(1)三級菜單
(2)可以次選擇進入各子菜單
(3)所需新知識點:列表、字典
要求:輸入back返回上一層,輸入quit退出整個程序
思路:
??? (1)首先定義好三級菜單字典;
(2)提取第一級省的編號,打印包含哪些省份,讓用戶輸入省份的編號,能夠顯示對應的省,這個過程需要創建一個字典,用于存放省原有的名稱和編號,以便用戶輸入之后進去匹配;
??? (3)進入第二級菜單,市的提取,市也存放在一個字典中,以便用戶輸入對應的編號的時候能夠到字典中查找,并返回對應的市;
(4)根據上面輸入,得到縣/區的列表,遍歷列表,并使用enumerate()給縣/區添加編號,對應的索引只需減一即可,因為不可能讓用戶看到從0開始,而列表默認是從0開始的;
流程圖如下:
??? 代碼如下:
1 import collections 2 dict_db = {"河南":[ 3 {"鄭州":["中原區","金水區","二七區","上街區","鞏義市","新鄭市","新密市","登封市","滎陽市","中牟縣"]}, 4 {"開封":["鼓樓區","龍亭區","禹王臺區","金明區","開封縣","尉氏縣","蘭考縣","杞縣","通許縣"]}, 5 {"南陽":["臥龍區","宛城區","鄧州市","桐柏縣","方城縣","淅川縣","鎮平縣","唐河縣","南召縣","內鄉縣"]}, 6 {"洛陽":["西工區","老城區","澗西區","瀍河回族區","洛龍區","吉利區","偃師市","孟津縣","汝陽縣"]}, 7 8 ], 9 "湖南":[ 10 {"長沙":["岳麓區","芙蓉區","天心區","開福區","雨花區","瀏陽市","長沙縣"]}, 11 {"岳陽":["岳陽樓區","云溪區","君山區","臨湘市","汨羅市","岳陽縣"]}, 12 {"株洲":["天元區","荷塘區","蘆淞區","石峰區","醴陵市","株洲縣","炎陵縣"]}, 13 {"湘潭":["岳塘區","雨湖區","湘鄉市","韶山市","湘潭縣"]}, 14 ], 15 "廣東":[ 16 {"廣州":["越秀區","荔灣區","海珠區","天河區","白云區","黃埔區","番禺區","花都區"]}, 17 {"深圳":["福田區","羅湖區","南山區","寶安區","龍崗區","鹽田區"]}, 18 {"珠海":["香洲區","斗門區","金灣區"]}, 19 ] 20 } 21 22 if __name__ == "__main__": 23 active = True 24 #程序標識符,控制程序什么時候停止,由于包含多層循環,當active=False的時候終止整個循環 25 #用戶輸入quit時,active=False,結束整個循環;用戶輸入back時,break,退出當前循環,跳回上一次循環 26 while active: 27 print("歡迎來到全國省市區查詢系統...") 28 p_dict = {} #用戶存放編號和省份,讓用戶輸入編號的時候可以顯示身份 29 print("+---------------------------------------------------------------+") 30 for p_num,p_key in enumerate(dict_db.keys(),1): #enumerate()添加編號 31 p_dict[p_num] = p_key 32 33 print("省的編號:%d 省的名稱:%s" %(p_num,p_key)) 34 print("+---------------------------------------------------------------+") 35 find_p = input("請輸入你要查詢的省的編號(輸入quit退出):") 36 if find_p == "quit": 37 break 38 39 elif find_p.isdigit() and int(find_p) <= len(p_dict): 40 print("\033[32;1m%s\033[0m" %(p_dict[int(find_p)])) #給輸出進行著色 41 province = p_dict[int(find_p)] 42 # 進入第二層循環 43 while active: 44 cities = dict_db[province] 45 cities_dict = {} #用于存放省對應的市,讓用戶輸入編號的時候可以顯示對應的市名 46 print("+---------------------------------------------------------------+") 47 for c_num, city_dict in enumerate(cities, 1): 48 for city in city_dict.keys(): 49 print("市的編號:%s 市的名稱:%s" % (c_num, city)) 50 cities_dict[c_num] = city 51 print("+---------------------------------------------------------------+") 52 find_city_num = input("請輸入你要查詢的市的編號(輸入quit退出,輸入back返回上一層):") 53 if find_city_num == "quit": 54 active = False 55 elif find_city_num == "back": 56 break 57 elif find_city_num.isdigit() and int(find_city_num) <= len(cities): 58 print("\033[22;1m%s %s\033[0m" %(p_dict[int(find_p)], cities_dict[int(find_city_num)])) 59 while active: 60 #進入第三層循環 61 countries = cities[int(find_city_num)-1][cities_dict[int(find_city_num)]] 62 print("+---------------------------------------------------------------+") 63 for country_num,country in enumerate(countries,1): 64 print("縣/區編號:%s 縣/區名稱:%s" %(country_num,country)) 65 print("+---------------------------------------------------------------+") 66 find_country_num = input("請輸入你要查詢的縣/區的編號(輸入quit退出,輸入back返回上一層):") 67 if find_country_num == "quit": 68 active = False 69 elif find_country_num == "back": 70 break 71 elif find_country_num.isdigit() and int(find_country_num) <= len(countries): 72 print("\033[1;1m%s %s %s\033[0m" %(p_dict[int(find_p)], cities_dict[int(find_city_num)],countries[int(find_country_num)-1])) 73 else: 74 print("對不起,您輸入的編號不對,請核對后重新輸入") 75 else: 76 print("對不起,你輸入的編號有誤,請核對后重新輸入!") 77 active = False 78 79 80 else: 81 print("您輸入的編號不對,請核對后重新輸入!")
??? 代碼運行結果如下:
歡迎來到全國省市區查詢系統...
+---------------------------------------------------------------+
省的編號:1????????? 省的名稱:廣東
省的編號:2????????? 省的名稱:河南
省的編號:3????????? 省的名稱:湖南
+---------------------------------------------------------------+
請輸入你要查詢的省的編號(輸入quit退出):2
河南
+---------------------------------------------------------------+
市的編號:1??????? 市的名稱:鄭州
市的編號:2??????? 市的名稱:開封
市的編號:3??????? 市的名稱:南陽
市的編號:4??????? 市的名稱:洛陽
+---------------------------------------------------------------+
請輸入你要查詢的市的編號(輸入quit退出,輸入back返回上一層):3
河南??? 南陽
+---------------------------------------------------------------+
縣/區編號:1??????? 縣/區名稱:臥龍區
縣/區編號:2??????? 縣/區名稱:宛城區
縣/區編號:3??????? 縣/區名稱:鄧州市
縣/區編號:4??????? 縣/區名稱:桐柏縣
縣/區編號:5??????? 縣/區名稱:方城縣
縣/區編號:6??????? 縣/區名稱:淅川縣
縣/區編號:7??????? 縣/區名稱:鎮平縣
縣/區編號:8??????? 縣/區名稱:唐河縣
縣/區編號:9??????? 縣/區名稱:南召縣
縣/區編號:10?????? 縣/區名稱:內鄉縣
+---------------------------------------------------------------+
請輸入你要查詢的縣/區的編號(輸入quit退出,輸入back返回上一層):4
河南??? 南陽??? 桐柏縣
+---------------------------------------------------------------+
縣/區編號:1??????? 縣/區名稱:臥龍區
縣/區編號:2??????? 縣/區名稱:宛城區
縣/區編號:3??????? 縣/區名稱:鄧州市
縣/區編號:4??????? 縣/區名稱:桐柏縣
縣/區編號:5??????? 縣/區名稱:方城縣
縣/區編號:6??????? 縣/區名稱:淅川縣
縣/區編號:7??????? 縣/區名稱:鎮平縣
縣/區編號:8??????? 縣/區名稱:唐河縣
縣/區編號:9??????? 縣/區名稱:南召縣
縣/區編號:10?????? 縣/區名稱:內鄉縣
+---------------------------------------------------------------+
請輸入你要查詢的縣/區的編號(輸入quit退出,輸入back返回上一層):back
+---------------------------------------------------------------+
市的編號:1??????? 市的名稱:鄭州
市的編號:2??????? 市的名稱:開封
市的編號:3??????? 市的名稱:南陽
市的編號:4??????? 市的名稱:洛陽
+---------------------------------------------------------------+
請輸入你要查詢的市的編號(輸入quit退出,輸入back返回上一層):2
河南??? 開封
+---------------------------------------------------------------+
縣/區編號:1??????? 縣/區名稱:鼓樓區
縣/區編號:2??????? 縣/區名稱:龍亭區
縣/區編號:3??????? 縣/區名稱:禹王臺區
縣/區編號:4??????? 縣/區名稱:金明區
縣/區編號:5??????? 縣/區名稱:開封縣
縣/區編號:6??????? 縣/區名稱:尉氏縣
縣/區編號:7??????? 縣/區名稱:蘭考縣
縣/區編號:8??????? 縣/區名稱:杞縣
縣/區編號:9??????? 縣/區名稱:通許縣
+---------------------------------------------------------------+
請輸入你要查詢的縣/區的編號(輸入quit退出,輸入back返回上一層):back
+---------------------------------------------------------------+
市的編號:1??????? 市的名稱:鄭州
市的編號:2??????? 市的名稱:開封
市的編號:3??????? 市的名稱:南陽
市的編號:4??????? 市的名稱:洛陽
+---------------------------------------------------------------+
請輸入你要查詢的市的編號(輸入quit退出,輸入back返回上一層):back
歡迎來到全國省市區查詢系統...
+---------------------------------------------------------------+
省的編號:1????????? 省的名稱:廣東
省的編號:2????????? 省的名稱:河南
省的編號:3????????? 省的名稱:湖南
+---------------------------------------------------------------+
請輸入你要查詢的省的編號(輸入quit退出):quit
解析:
??? 多級菜單中要求輸入quit退出整個循環,輸入back返回上一層;這就啟示我們,要設置一個程序中所有循環的運行標識符,無論在那個環節,只要用戶輸入quit,那么就能夠退出整個循環,在上述程序中,我們設置了程序運行標識符active,開始默認是True,當我們向結束程序的時候,就把中國和標識符設置為False,這樣就終止了整個程序的運行;當用戶輸入back的時候,我們只需要使用break結束當前循環,程序就會退出上一層循環,我們的目的也就達到了。
??? 上面的循環用到了層級循環,即如下:
while True:
pass
??????? while True:
pass
while True:
pass
??? 在遍歷中,我們要知道我們得到的對象的屬性,是字典還是列表,還是字符串;只有這樣,我們才能使用相應的方法對應相應的操作。
??? enumerate()函數用來在遍歷列表對象的元素的時候給元素添加序號,可以指定其實位置。比如商品編號不可能從0開始,這樣不符合大眾的習慣。