day1作業二:多級菜單操作(函數實現)
作業二:多級菜單
(1)三級菜單
(2)可以次選擇進入各子菜單
(3)所需新知識點:列表、字典
要求:輸入back返回上一層,輸入quit退出整個程序
本示例的三級菜單是一個yaml文件格式,格式如下:
香港: 香港 澳門: 澳門 臺灣: 臺灣 釣魚島: 釣魚島 北京市: - 市轄區 - 東城區 - 西城區 - 崇文區 - 宣武區 - 朝陽區 河北省: - 石家莊市: - 長安區 - 橋東區 - 橋西區 - 新華區 - 唐山市: - 路南區 - 路北區 - 古冶區 - 開平區- 秦皇島市: - 海港區 - 山海關區 山西省: - 太原市: - 小店區 - 迎澤區 - 杏花嶺區 - 大同市: - 城 區 - 礦 區 - 南郊區 - 陽泉市: - 城 區 - 礦 區 - 郊 區 - 平定縣 - 盂 縣 - 長治市: - 城 區 - 郊 區 - 長治縣 - 襄垣縣 - 屯留縣
yaml格式的處理方法如下:
首先,上面的格式是一個多級模式,有一級,二級,三級的情況,使用yaml處理後的字典如下形式:
處理yaml的代碼:
import yaml,collections with open("222","r") as f: dic = yaml.load(f) print(dic)
運行得到的字典如下格式:
{‘香港‘: ‘香港‘,
‘北京市‘: [‘市轄區‘, ‘東城區‘, ‘西城區‘, ‘崇文區‘, ‘宣武區‘, ‘朝陽區‘],
‘臺灣‘: ‘臺灣‘,
‘澳門‘: ‘澳門‘,
‘河北省‘: [{‘石家莊市‘: [‘長安區‘, ‘橋東區‘, ‘橋西區‘, ‘新華區‘]}, {‘唐山市‘: [‘路南區‘, ‘路北區‘, ‘古冶區‘, ‘開平區‘]}, {‘秦皇島市‘: [‘海港區‘, ‘山海關區‘]}],
‘釣魚島‘: ‘釣魚島‘,
‘山西省‘: [{‘太原市‘: [‘小店區‘, ‘迎澤區‘, ‘杏花嶺區‘]}, {‘大同市‘: [‘城 區‘, ‘礦 區‘, ‘南郊區‘]}, {‘陽泉市‘: [‘城 區‘, ‘礦 區‘, ‘郊 區‘, ‘平定縣‘, ‘盂 縣‘]}, {‘長治市‘: [‘城 區‘, ‘郊 區‘, ‘長治縣‘, ‘襄垣縣‘, ‘屯留縣‘]}]}
得到的是字典,一級如,"香港":"香港",值是字符串類型;二級如: ‘北京市‘: [‘市轄區‘, ‘東城區‘, ‘西城區‘, ‘崇文區‘, ‘宣武區‘, ‘朝陽區‘],值是列表形式,裏面嵌套的是字符串;最復雜的是三級模式,如:‘河北省‘: [{‘石家莊市‘: [‘長安區‘, ‘橋東區‘, ‘橋西區‘, ‘新華區‘]}, {‘唐山市‘: [‘路南區‘, ‘路北區‘, ‘古冶區‘, ‘開平區‘]}, {‘秦皇島市‘: [‘海港區‘, ‘山海關區‘]}],裏面第二層是列表,列表裏面嵌套的還是字典。
思路:
(1)本項目的核心其實是得到省/市/縣這樣的模式,在處理的過程中,我們根據值對應的類型進行判斷,使用那種方式處理比較好;
(2)首先我們遍歷字典的第一層,得到省份,把省份放在一個字典中,這樣,我們就可以根據用戶輸入的值的情況去進行輸出對應的省;
(3)得到省之後,我們可以得到省下面的鍵值,判斷值對應的類型,根據不同值的類型進行不同方式的操作;
(4)如果值是字符串,說明是一級菜單形式,這種方式最好處理;
(5)如果值是列表,且第一個值是字符串,說明是北京這種的二級模式,使用二級模式的方法進行展示;
(6)如果值是列表,且第一個值是一個字典的形式,說明是三級模式的情形,就要使用三級模式來進行操作;
(7)定義全局變量,我們要知道我們需要得到的是什麽,我們要得到省市縣三級模式;只有知道了對應的省市縣,我們只需要去字典中遍歷即可得到值的信息。
流程圖如下:
代碼如下:
1 import sys,yaml,os 2 def numeric(s): 3 """判斷用戶輸入是否為數字行字符串,並進行轉換""" 4 if str.isdigit(s): 5 s = int(s) 6 return s 7 8 def province_show(dic_db): 9 """處理省份的模塊""" 10 global P_NAME #定義全局變量,這個在程序中很重要,讓我們在程序的運行過程中牢牢掌握我們需要的參數是什麽 11 global C_NAME #定義全局變量 12 province_dict = {} #用來存儲省信息的字典,以便用戶輸入的時候從中選擇展示 13 for num,province_name in enumerate(dic_db.keys(),1): 14 ‘‘‘展示模塊,展示系統中的省份‘‘‘ 15 province_dict[num] = province_name #添加到字典中,形成編號和省份組合的字典 16 print("%d. %s" %(num,province_name) + "\t",end="") 17 ‘‘‘\t是制表符,用來進行分割,end是讓程序不要換行,因為我們知道,print()語句最後一句會有一個換行符‘‘‘ 18 if num % 4 == 0: 19 print() 20 print("\n==============================================================") 21 print("q:Exit") 22 ‘‘‘第一層省份,沒有退回第一層的操作‘‘‘ 23 find_index = input("請輸入你要查詢的省的編號/名字:") #輸入編號 24 find_index = numeric(find_index) 25 if find_index == "q": 26 sys.exit(0) #退出整個程序 27 if find_index in province_dict.values(): 28 P_NAME = find_index #省的名稱 29 show(P_NAME) #展示省的信息 30 elif find_index in province_dict.keys(): 31 P_NAME = province_dict[find_index] 32 show(P_NAME) 33 else: 34 print("對不起,您輸入的編號/省份不對,請重新輸入!") 35 36 return P_NAME #省的函數運行完成之後,返回省的名稱,以便後續使用,因為主要是得到省/市/縣 37 38 def judge(name,dic_db): #判斷省下面的情況,由於省下面有些是1級菜單,二級菜單,三級菜單,根據值的類型不同,進行判斷 39 """判斷省下面是幾級菜單,香港只有一級,北京二級,山西三級""" 40 city_name = dic_db[name] 41 if type(city_name) == str: #一級菜單的值是一個字符串 42 return 43 elif type(city_name) == list: #二級菜單的值是一個列表 44 if type(city_name[0]) == str: 45 ‘‘‘只有兩級查詢‘‘‘ 46 city_show(name,city_name) #根據值的不同,調用不同的處理函數 47 elif type(city_name[0]) == dict: #三級菜單的值是一個字典 48 ‘‘‘三級模塊‘‘‘ 49 country_show(name,city_name) #調用三級處理函數 50 51 def city_show(province,city_list): #傳入省的名字和城市列表 52 global C_NAME #定義全局變量,用作市,省對應下面的市 53 ‘‘‘二級處理模塊‘‘‘ 54 city_dict = {} #處理二級城市字典,用來遍歷用戶輸入的情況 55 for city_num,city_name in enumerate(city_list,1): #把省對應的所有市放到一個字典中,用戶輸入的時候方便輸出對應的值 56 city_dict[city_num] = city_name 57 print("%d.%s" %(city_num,city_name) + "\t",end=‘‘) 58 if city_num % 4 == 0: 59 print() 60 print("\n==================================================================") 61 print("q:Exit b:退回上一層") 62 #在函數中,結束函數的方法是return,我們在函數中可以定義循環,break結束當前循環,遇到retrun退出當前函數 63 city_index = input("請輸入您要查詢的市的編號/名字:") 64 city_index = numeric(city_index) 65 if city_index == "q": 66 sys.exit() 67 if city_index == "b": 68 return 69 elif city_index in city_list: 70 C_NAME = city_index 71 show(province,C_NAME) 72 elif city_index in city_dict.keys(): 73 C_NAME = city_dict[city_index] 74 show(province,C_NAME) 75 return 76 else: 77 print("您輸入的市的編號/名字不對,請核對後重新輸入!") 78 79 def country_show(province,country_list): 80 ‘‘‘處理三級模塊[{}]‘‘‘ 81 global C_NAME 82 global C_INDEX 83 city_dict = {} 84 for c_num,c_name in enumerate(country_list,1): 85 for key in c_name.keys(): 86 city_dict[c_num] = key 87 for k,v in city_dict.items(): 88 #遍歷字典中的市名字和編號 89 print("%d.%s" %(k,v) + "\t",end=‘‘) 90 if k % 4 == 0: 91 print() 92 print("\n===============================================================================") 93 print("q:Exit b:退回上一層") 94 while True: 95 city_num = input("請輸入您要查詢的市的編號/名字:") 96 city_num = numeric(city_num) 97 if city_num == ‘q‘: 98 sys.exit() 99 if city_num == "b": 100 return 101 elif city_num in city_dict.values(): #字典的鍵和值 102 C_NAME = city_num 103 for key,value in city_dict.items(): 104 if value == C_NAME: 105 C_INDEX = key 106 else: 107 pass 108 show(province,C_NAME) 109 elif city_num in city_dict.keys(): 110 C_NAME = city_dict[city_num] 111 C_INDEX =city_num 112 show(province,C_NAME) 113 else: 114 print("您輸入的市的編號/名字不對,請核對後重新輸入!") 115 return 116 while True: 117 countries = country_list[C_INDEX - 1][C_NAME] 118 for c_index,country in enumerate(countries,1): 119 print("%d.%s" %(c_index,country) + "\t",end=‘‘) 120 if k % 4 == 0: 121 print() 122 print("\n===============================================================================") 123 print("q:Exit b:退回上一層") 124 country_index = input("請輸入你要查詢的縣(區)編號/名字:") 125 country_index = numeric(country_index) 126 if country_index == "q": 127 sys.exit() 128 if country_index == "b": 129 break 130 elif country_index in countries: 131 show(province,C_NAME,country_index) 132 elif country_index in range(1,len(countries)+1): 133 show(province,C_NAME,countries[country_index-1]) 134 else: 135 print("您輸入的市(區)編號/名字有誤,請核對後重新輸入!") 136 137 def framework(province=‘‘,city=‘‘,country=‘‘): 138 """系統展示模塊,展示系統功能""" 139 os.system("clear") #清屏 140 message = ‘‘‘ 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 142 143 \033[32;1m歡迎來到全國省市查詢系統\033[0m 144 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 146 147 *************************************************************************** 148 149 省 份:%s 150 151 市(區):%s 152 153 縣(區):%s 154 155 *************************************************************************** 156 ‘‘‘ 157 print(message %(province,city,country)) 158 159 def show(province_name="",city_name="",country_name=""): 160 output = ‘‘‘\033[32;1m 161 ---------------------------------------------------------------------------- 162 163 美麗的%s %s %s 164 165 歡迎您! 166 167 這裏山美,水美,姑娘更美 168 169 ---------------------------------------------------------------------------- 170 \033[0m‘‘‘ 171 print(output %(province_name,city_name,country_name)) 172 173 if __name__ == "__main__": 174 with open("222","r") as f: #打開文件 175 dic_db = yaml.load(f) #得到數據庫字典 176 framework() 177 while True: 178 ProvinceName = province_show(dic_db) 179 judge(ProvinceName,dic_db)
代碼運行如下:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
歡迎來到全國省市查詢系統
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
***************************************************************************
省 份:
市(區):
縣(區):
***************************************************************************
1. 澳門 2. 山西省 3. 北京市 4. 臺灣
5. 釣魚島 6. 香港 7. 河北省
==============================================================
q:Exit
請輸入你要查詢的省的編號/名字:1
----------------------------------------------------------------------------
美麗的澳門
歡迎您!
這裏山美,水美,姑娘更美
----------------------------------------------------------------------------
1. 澳門 2. 山西省 3. 北京市 4. 臺灣
5. 釣魚島 6. 香港 7. 河北省
==============================================================
q:Exit
請輸入你要查詢的省的編號/名字:2
----------------------------------------------------------------------------
美麗的山西省
歡迎您!
這裏山美,水美,姑娘更美
----------------------------------------------------------------------------
1.太原市 2.大同市 3.陽泉市 4.長治市
===============================================================================
q:Exit b:退回上一層
請輸入您要查詢的市的編號/名字:2
----------------------------------------------------------------------------
美麗的山西省 大同市
歡迎您!
這裏山美,水美,姑娘更美
----------------------------------------------------------------------------
1.城 區
2.礦 區
3.南郊區
===============================================================================
q:Exit b:退回上一層
請輸入你要查詢的縣(區)編號/名字:2
----------------------------------------------------------------------------
美麗的山西省 大同市 礦 區
歡迎您!
這裏山美,水美,姑娘更美
----------------------------------------------------------------------------
1.城 區
2.礦 區
3.南郊區
===============================================================================
q:Exit b:退回上一層
請輸入你要查詢的縣(區)編號/名字:b
請輸入您要查詢的市的編號/名字:b
1. 澳門 2. 山西省 3. 北京市 4. 臺灣
5. 釣魚島 6. 香港 7. 河北省
==============================================================
q:Exit
請輸入你要查詢的省的編號/名字:北京市
----------------------------------------------------------------------------
美麗的北京市
歡迎您!
這裏山美,水美,姑娘更美
----------------------------------------------------------------------------
1.市轄區
==================================================================
q:Exit b:退回上一層
請輸入您要查詢的市的編號/名字:1
----------------------------------------------------------------------------
美麗的北京市 市轄區
歡迎您!
這裏山美,水美,姑娘更美
----------------------------------------------------------------------------
1. 澳門 2. 山西省 3. 北京市 4. 臺灣
5. 釣魚島 6. 香港 7. 河北省
==============================================================
q:Exit
請輸入你要查詢的省的編號/名字:7
----------------------------------------------------------------------------
美麗的河北省
歡迎您!
這裏山美,水美,姑娘更美
----------------------------------------------------------------------------
1.石家莊市 2.唐山市 3.秦皇島市
===============================================================================
q:Exit b:退回上一層
請輸入您要查詢的市的編號/名字:石家莊市
----------------------------------------------------------------------------
美麗的河北省 石家莊市
歡迎您!
這裏山美,水美,姑娘更美
----------------------------------------------------------------------------
1.長安區 2.橋東區 3.橋西區 4.新華區
===============================================================================
q:Exit b:退回上一層
請輸入你要查詢的縣(區)編號/名字:長安區
----------------------------------------------------------------------------
美麗的河北省 石家莊市 長安區
歡迎您!
這裏山美,水美,姑娘更美
----------------------------------------------------------------------------
1.長安區 2.橋東區 3.橋西區 4.新華區
===============================================================================
q:Exit b:退回上一層
請輸入你要查詢的縣(區)編號/名字:q
上面代碼,我學到了如下知識:
(1)yaml格式文件的處理,導入yaml模塊,使用yaml.load()進行文件字符串轉換為字典形式;
(2)全局變量的定義,在很多時候,在程序運行的過程中,我們總是需要的到幾個重要的變量,使用全局變量,能夠讓我們更好的理清思路,全局變量使用global來進行定義;
(3)函數def的結束是遇到return,遇到return無論什麽時候,就結束這個函數,因為當我們與while結合使用的時候,可以直接使用return來結束這個循環;
(4)字典、列表的處理方式;
(5)enumerate()函數的使用;
(6)sys.exit()來退出整個程序,sys模塊;
(7)不怕麻煩,牢牢知道自己需要的是什麽自己的目的是什麽。
day1作業二:多級菜單操作(函數實現)