需要用到的Python知識點
- Python的對象屬性方法;
- 用到字典{key:value}值的提取;
- 列表的增加;
- if循環結合break的使用;
- yaml文件讀取;
代碼如下:
1 #!/usr/bin/python34 2 import sys,os,re,yaml,time 3 #reload(sys) 4 #sys.setdefaultencoding('utf-8') 5 6 ######################對input輸入字符類型判斷並轉化##################### 7 def input_handle(s): 8 if str.isdigit(s): ###對輸入是否是數字進行判斷 9 s = int(s) ###如果輸出的是個數字,則轉化為整數類型 10 return s 11 12 # try: 13 # eval(s) ###eval將字符串str當成有效的表達式來求值並返回計算結果 14 # except NameError: ###名稱錯誤 15 # return s 16 # except SyntaxError: ###語法錯誤 17 # return s 18 # else: 19 # return eval(s) 20 21 22 ####################框架函數###################### 23 def framework(province='',city='',county=''): 24 os.system('cls') ###清屏### 25 print(''' 26 ****************************************************************** 27 * * 28 * 歡迎訪問全國省市查詢系統 * 29 * * 30 ****************************************************************** 31 32 33 +----------------------------------------------------------------- 34 | 省份: %s 35 | 36 | 市(區): %s 37 | 38 | 縣(區): %s 39 +----------------------------------------------------------------- 40 ''' % (province,city,county)) 41 42 ######################輸出展示函數################# 43 def show(province_name='',city_name='',county_name=''): 44 output= ''' 45 ****************************************************************** 46 * * 47 美麗的%s %s %s 48 * 歡迎您 * 49 這里的山美,水美,妹子更美 50 * * 51 ****************************************************************** 52 ''' 53 print(output % (province_name,city_name,county_name)) 54 55 56 ###################菜單第一層省份或直轄市輸出函數################# 57 def province_show(province_list): 58 59 ############申明全局變量#################### 60 global P_NAME 61 global C_NAME 62 global X_NAME 63 global FLAG_M 64 65 province_dict = {} 66 ############對省份或直轄市列表參數進行遍歷並加上數字編號############### 67 for k,v in enumerate(province_list,1): 68 province_dict[k] = v 69 print('%d . %s' % (k,v) + '\t',end='') ###加上end參數,取消默認換行### 70 if k % 4 == 0: ###按4列換行### 71 print() 72 print('\n================================================================') 73 print('q : Exit') 74 75 ###############鍵盤讀入編號或省份,可以輸入漢字################# 76 province_index = input('請輸入編號或省份 : ') 77 78 ###############如果輸入非空,對輸入進行判斷並轉化類型########### 79 if len(province_index) != 0: 80 province_index = input_handle(province_index) 81 82 if province_index == 'q': ###如果輸入為q,則退出程序### 83 sys.exit(0) 84 elif province_index in province_dict.keys(): ###如果輸入為數字編號,則從字典中獲取具體省份或直轄市名稱### 85 P_NAME = province_dict[province_index] ###對全局變量賦值省份名稱### 86 elif province_index in province_dict.values(): ###如果輸入為具體省份,則從字典中獲取具體省份或直轄市名稱### 87 P_NAME = province_index ###對全局變量賦值省份名稱### 88 else: 89 P_NAME = '' ###輸入其他字符,賦值全局變量為空### 90 91 while P_NAME: ###全局變量不為空進行循環### 92 framework(P_NAME,C_NAME,X_NAME) ###調用框架### 93 if type(yaml_dict[P_NAME]) is list: 94 city_show(P_NAME) ###調用城市函數,並傳入省份值### 95 if FLAG_M == 'b': ###城市函數輸入b,返回上一層,重新選擇省份### 96 break 97 else: 98 show(P_NAME) ###調用輸出展示函數### 99 time.sleep(5) 100 P_NAME = '' 101 break 102 else: 103 print('輸入錯誤,請重新輸入!') ###P_NAME為空,即輸入錯誤,重新輸入### 104 time.sleep(2) 105 106 ##############菜單第二層城市輸出函數####################### 107 def city_show(province_name): 108 109 ############申明全局變量############### 110 global P_NAME 111 global C_NAME 112 global X_NAME 113 global FLAG_M 114 115 city_name = '' ###定義城市變量默認為空### 116 city_list = yaml_dict[province_name] ###定義賦值城市列表### 117 city_dict = {} ###定義城市編號和名稱字典### 118 city_county_dict = {} ###定義地級市和下屬區縣字典### 119 120 ############對城市列表參數進行遍歷並加上數字編號############### 121 for k,v in enumerate(city_list,1): 122 if type(v) is str: ###直轄市只有二層菜單,第二層為直接的各區或縣,值類型為具體字符### 123 city_dict[k] = v ###對直轄市下的區或縣進行新字典賦值,方便查詢和展示### 124 print('%d . %s' % (k,v) + '\t',end='') ###末尾加',',取消默認換行### 125 elif type(v) is dict: ###其他省份有三層菜單,第二層為各地級市,值類型字典### 126 for kk,vv in v.items(): ###對地級市的字典進行遍歷### 127 city_dict[k] = kk ###對其他省份下的地級市進行新字典賦值,方便查詢和展示### 128 city_county_dict[kk] = vv ###對二層地級市和三層縣市重新賦值新字典### 129 print('%d . %s' % (k,kk) + '\t',end='') ###加上end參數,取消默認換行### 130 else: 131 pass 132 133 if k % 4 == 0: ###按4列換行### 134 print() 135 print('\n================================================================') 136 print('q : Exit b : Back') 137 138 ###############鍵盤讀入編號或區市,可以輸入漢字################# 139 city_index = input('請輸入編號或區市 : ') 140 141 ###############如果輸入非空,對輸入進行判斷並轉化類型########### 142 if len(city_index) != 0: 143 city_index = input_handle(city_index) 144 145 if city_index == 'q': ###如果輸入為q,則退出程序### 146 sys.exit(0) 147 elif city_index == 'b': ###如果輸入為b,則返回上一層,重新選擇省份或直轄市### 148 (P_NAME,C_NAME,FLAG_M) = ('','','b') ###全局變量P_NAME,C_NAME設置為空,FLAG_M設置為b,則返回上一層### 149 return ###直接返回,不進行函數以下的操作### 150 elif city_index in city_dict.keys(): ###如果輸入為數字編號,則從字典中獲取具體城市名稱### 151 city_name = city_dict[city_index] ###賦值地級市的名稱,並對全局變量進行賦值### 152 (P_NAME,C_NAME,FLAG_M) = (province_name,city_name,'') 153 elif city_index in city_dict.values(): ###如果輸入為城市名稱,則從字典中獲取具體省份名稱### 154 city_name = city_index ###賦值地級市的名稱,並對全局變量進行賦值### 155 (P_NAME,C_NAME,FLAG_M) = (province_name,city_name,'') 156 else: 157 pass ###如果輸入其他字符,則不做任何操作### 158 159 if city_name: ###如果地級市名字不為空,即鍵盤輸入為要求字符### 160 if city_name in city_county_dict.keys(): ###判斷是省份的地級市名字### 161 while C_NAME: ###環境變量C_NAME不為空### 162 framework(P_NAME,C_NAME,X_NAME) ###調用框架函數,並將省份名字和地級市名字傳入### 163 164 ###調用三層區縣顯示函數,並傳入具體變量### 165 county_show(P_NAME,C_NAME,city_county_dict[city_name]) 166 if FLAG_N == 'b': ###三層區縣函數輸入b,返回上一層,重新選擇地級市### 167 break 168 else: 169 print('輸入錯誤,請重新輸入!') ###C_NAME為空,即輸入錯誤,重新輸入### 170 time.sleep(2) 171 else: ###判斷是直轄市的區或縣名字### 172 show(P_NAME,C_NAME) ###調用輸出展示函數### 173 time.sleep(5) 174 else: ###輸入非要求字符,提示重新輸入### 175 print('輸入錯誤,請重新輸入!') 176 time.sleep(2) 177 178 ##############菜單第三層區縣輸出函數####################### 179 def county_show(province_name,city_name,county_list): 180 181 ############申明全局變量#################### 182 global P_NAME 183 global C_NAME 184 global X_NAME 185 global FLAG_N 186 187 county_name = '' ###定義三級區縣變量默認為空### 188 county_dict = {} ##定義賦值區縣字典### 189 190 ############對區縣列表參數進行遍歷並加上數字編號############### 191 for k,v in enumerate(county_list,1): 192 if type(v) is str: ###第三層為直接的各區或縣,值類型為具體字符str### 193 county_dict[k] = v ###對區或縣進行新字典賦值,方便查詢和展示### 194 print('%d . %s' % (k,v) + '\t',end='') ###加上end參數,取消默認換行### 195 196 if k % 4 == 0: ###按4列換行### 197 print() 198 print('\n================================================================') 199 print('q : Exit b : Back') 200 201 ###############鍵盤讀入編號或區縣,可以輸入漢字################# 202 county_index = input('請輸入編號或區縣 : ') 203 204 ###############如果輸入非空,對輸入進行判斷並轉化類型########### 205 if len(county_index) != 0: 206 county_index = input_handle(county_index) 207 208 if county_index == 'q': ###如果輸入為q,則退出程序### 209 sys.exit(0) 210 elif county_index == 'b': ###如果輸入為b,則返回上一層,重新選擇第二層地級市### 211 (P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,'','','b') ###全局變量C_NAME設置為空,FLAG_M設置為b,則返回上一層### 212 return ###直接返回,不進行函數以下的操作### 213 elif county_index in county_dict.keys(): ###如果輸入為數字編號,則從字典中獲取具體區縣名稱### 214 county_name = county_dict[county_index] ###賦值區縣的名稱,並對全局變量進行賦值### 215 (P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,city_name,county_name,'') 216 elif county_index in county_dict.values(): ###如果輸入為區縣名稱,則從字典中獲取具體區縣名稱### 217 county_name = county_index ###賦值區縣的名稱,並對全局變量進行賦值### 218 (P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,city_name,county_name,'') 219 else: ###如果輸入其他字符,則不做任何操作### 220 (P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,city_name,'','') 221 222 if county_name: ###如果區縣名字不為空,即鍵盤輸入為要求字符### 223 show(P_NAME,C_NAME,X_NAME) ###調用輸出展示函數### 224 time.sleep(5) 225 else: 226 print('輸入錯誤,請重新輸入!') ###輸入非要求字符,提示重新輸入### 227 time.sleep(2) 228 229 230 231 ##########################################主程序############################### 232 233 ###############讀取yaml格式文件####################### 234 fd = open(r'G:\sicps\test\pro',encoding='utf-8') 235 yaml_dict = yaml.load(fd) 236 237 ###############定義全局變量########################### 238 P_NAME = '' ###省份或直轄市全局變量### 239 C_NAME = '' ###各省地級市或直轄市區縣的全局變量### 240 X_NAME = '' ###各省地級市下的區或縣 全局變量### 241 FLAG_M = '' ###退出菜單第二層,返回上一層循環的變量### 242 FLAG_N = '' ###退出菜單第三層,返回上一層循環的變量### 243 244 ###############獲取省份或直轄市的列表################# 245 prov_list = yaml_dict.keys() 246 247 ###############主循環開始############################# 248 while True: 249 framework(P_NAME,C_NAME,X_NAME) ###調用框架函數,顯示初始狀態### 250 province_show(prov_list) ###調用第一層省份或直轄市輸出函數###