作業二:多級菜單 (1)三級菜單 (2)可以次選擇進入各子菜單 (3)所需新知識點:列表、字典 要求:輸入back返回上一層,輸入quit退出整個程式 思路: (1)首先定義好三級菜單字典; (2)提取第一級省的編號,列印包含哪些省份,讓用戶輸入省份的編號,能夠顯示對應的省,這個過程需要創建一個字典 ...
作業二:多級菜單
(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開始,這樣不符合大眾的習慣。