1. 程式人生 > >day1作業二:多級菜單操作(函數實現)

day1作業二:多級菜單操作(函數實現)

數據庫 語句 會有 是否 臺灣 inpu return .com {}

作業二:多級菜單

(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作業二:多級菜單操作(函數實現)