python開發基礎做業02:三級菜單,使用字典dic及列表

做業要求及提示:三級菜單python

'''app

1.三級菜單函數

2.可依次進入各子菜單測試

3.菜單可以回到上一級編碼

4.用到知識點:字典、列表、多層循環、函數對象

條件:基本  if  elseblog

         嵌套  if...if...if...elseip

         if elif elseutf-8

循環:while 條件:ci

                 .....

          else:

                 ...

continue  終止當前循環,開始下一次循環

break 終止全部循環(跳出所在while或for...)

下述示例,部分判斷中的break可變動爲continue,並刪除部分非必要for循環。

'''

 

流程圖

 

 

代碼示例1:

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author : "David J"

# 使用字典保存省份、市、縣列表
# 這是一個多級的字典,能夠經過for查詢每個級別的信息,級別:省份、市、區

_country_dict = {
    '1.河南省': {
        '1.鄭州市': {'1.金水區': ['區號100', '郵編400000'], '2.中原區': ['區號101', '郵編400001'], '3.二七區': ['區號102', '郵編400002']},
        '2.洛陽市': {'1.老城區': ['區號200', '郵編200000'], '2.洛龍區': ['區號201', '郵編200001'], '3.西工區': ['區號203', '郵編200002']},
        '3.信陽市': {'1.溮河區': ['區號300', '郵編300000'], '2.平橋區': ['區號301', '郵編300001'], '3.固始區': ['區號203', '郵編200002']}
    },
    '2.河北省': {
        '1.石家莊市': {'1.長安區': ['區號400', '郵編500000'], '2.新華區': ['區號401', '郵編500001'], '3.橋西區': ['區號402', '郵編500002']},
        '2.保定市': {'1.競秀區': ['區號500', '郵編600000'], '2.蓮池區': ['區號501', '郵編600001'], '3.滿城區': ['區號503', '郵編600002']},
        '3.邯鄲市': {'1.叢臺區': ['區號600', '郵編700000'], '2.邯山區': ['區號601', '郵編700001'], '3.復興區': ['區號602', '郵編700002']}
    },
    '3.湖南省': {
        '1.長沙市': {'1.芙蓉區': ['區號700', '郵編800000'], '2.嶽麓區': ['區號701', '郵編800001'], '3.雨花區': ['區號702', '郵編800002']},
        '2.常德市': {'1.武陵區': ['區號800', '郵編900000'], '2.鼎城區': ['區號801', '郵編900001'], '3.未知區': ['區號803', '郵編900002']},
        '3.湘潭市': {'1.叢臺區': ['區號900', '郵編110000'], '2.邯山區': ['區號901', '郵編110001'], '3.復興區': ['區號902', '郵編110002']}
    },
    '4.湖北省': {
        '1.武漢市': {'1.江岸區': ['區號110', '郵編810000'], '2.江漢區': ['區號111', '郵編810001'], '3.漢陽區': ['區號112', '郵編810002']},
        '2.宜昌市': {'1.西陵區': ['區號120', '郵編910000'], '2.點軍區': ['區號121', '郵編910001'], '3.夷陵區': ['區號123', '郵編910002']},
        '3.孝感市': {'1.孝南區': ['區號130', '郵編120000'], '2.孝感區': ['區號131', '郵編120001'], '3.未知區': ['區號132', '郵編120002']}
    }
}


# 定義一個函數,用於將查詢到的省份信息傳遞給此函數

def district():
    while True:
        # 定義一個空列表,用於保存城市信息
        cy = []
        city_dict = {}
        # %s是處理對象的一種方法,是佔位符,它的值來源於後面的% province省份的值,而後經過print打印出來
        # province的值是在查詢身份的語句裏面定義的
        print('%s 有如下城市:' % province)
        # 經過for循環將用戶選擇的省份下面的城市列表放到_city中
        for _city in sorted(_country_dict[province].keys()):
            # 打印用戶選擇的省份下面的城市的列表
            print(_city)
            # 將用戶選擇的省份下面的城市列表附加保存到cy列表中
            city_num=_city[:1]
            city_dict[city_num]={"sort_num":city_num,"city_name":_city}
            cy.append(_city)
        # print(cy)
        # 提供交互式界面,讓用戶輸入要查詢的城市編號
        _city_number = input('請輸入要查詢的城市編號:(後退:b 退出:q)')
        # 打印城市和區縣列表的分隔符
        print('---------------------------------------------------')
        # 若是用戶輸入的編號是q,則退出查詢
        if _city_number == 'q':
            print('已退出查詢!')
            exit()
        # 若是用戶輸入的是b,則中斷當前的判斷,退回到上一級省份目錄
        elif _city_number == 'b':
            break
        else:
            # 若是用戶輸入的是正確的編號,則從cy城市列表或字典中獲取到城市信息,放到city中
            # 開始一個新的循環,便於b返回
            for city in _country_dict[province].keys():
                # 判斷用戶輸入的城市編號和cy列表中的城市編號是否匹配
                if _city_number in city_dict.keys():
                    # 若是匹配,則將當前城市的名稱保存到_citynumber變量中
                    _citynumber = city_dict[_city_number]['city_name']
                    # %s是處理對象的一種方法,是佔位符,它的值來源於% _citynumber具體城市的值,而後經過print打印出來
                    print('%s 該城市有下列區縣:' % _citynumber)

                    # 經過while循環,將具體城市下面的區縣信息查出來
                    while True:
                        # 用於保存區縣信息的列表
                        n = []
                        dist_dict = {}
                        # 經過for循環將用戶選擇的城市下面的區縣列表放到_districts中
                        for _districts in sorted(_country_dict[province][_citynumber].keys()):
                            # 打印區縣的名稱信息,例如二七區
                            print(_districts)
                            dist_num=_districts[:1]
                            dist_dict[dist_num]={"sort_num":dist_num,"dist_name":_districts}
                            # 將區縣信息保存到n列表中
                            n.append(_districts)
                        # 提供交互式界面,讓用戶輸入區縣的查詢行爲
                        _phone_number = input('請輸入要查詢的區縣的編號:(後退:b 退出:q)')
                        # # 打印區縣和區縣具體信息列表的分隔符
                        print('---------------------------------------------------')
                        # 若是用戶輸入了q,則結束查詢
                        if _phone_number == 'q':
                            print('已結束查詢!')
                            exit()
                        # 若是用戶輸入了b,則返回到上一級查詢
                        elif _phone_number == 'b':
                            break  # 跳出當前循環,回到上一級循環
                        else:
                            # 經過循環遍歷從區縣列表n中讀取區縣信息到pn中
                            for pn in _country_dict[province][_citynumber].keys():
                                # 若是用戶輸入的區縣編號和pn中的區縣編號匹配
                                if _phone_number in dist_dict.keys():
                                    # 則將具體匹配到的區縣的名稱保存到phone_number中
                                    phone_number = dist_dict[_phone_number]['dist_name']
                                    # %s的值來源於% _phone_number具體區縣的值,而後經過print打印出來
                                    print('%s 的信息以下:' % phone_number)
                                    # 經過for循環將用戶選擇的具體的區縣的列表中的信息放到p中
                                    for p in _country_dict[province][_citynumber][phone_number]:
                                        # 打印具體區縣下面的郵政編碼和區號信息
                                        print(p)
                                    # 打印查詢分隔符
                                    print('---------------------------------------------------')
                                    # 經過交互式界面詢問用戶,是否繼續查詢
                                    _end_get = input('查詢已完成,是否繼續其餘查詢?(繼續:Y 其餘:結束)')
                                    # 若是用戶輸入的是大寫的Y,則返回到上一級繼續查詢
                                    if _end_get == 'Y':
                                        break
                                    # 若是用戶輸入除了大寫Y之外其餘的值,則結束查詢
                                    else:
                                        print('已結束查詢!')
                                        exit()
                            # 若是用戶輸入的區縣編號有誤,提示用戶從新輸入
                            else:
                                print('區縣編號輸入錯誤,請從新輸入')
                    # 第三個while True循環的退出
                    break
    # 若是用戶輸入的城市編號不對,則提示用戶從新輸入
    else:
        print('城市編號輸入有誤,請從新輸入!')
    # 第二個while True不設置中斷條件,用戶能夠退回到當前的城市查詢列表中

while True:

    # 初始化空列表,用於保存省份信息
    c = []
#    country_list=[]
    country_dict={}
    # 從國家字典中取第一級列表每一行的值,循環放到_country中
    for _country in sorted(_country_dict.keys()):
        # 逐行輸出國家字典裏第一級列表每一行的值
        print (_country)
        '''
        打印效果
        1.河南省
        2.河北省
        3.湖南省
        4.湖北省
    '''
        # 將取到的第一級列表每一行的值追加放入c列表中
    #    country_list=_country.split('.')
    #    country_num=country_list[0].strip()
    #    print(country_list,country_num)
        #或取_country第一個字符
        country_num=_country[:1]
    #    print(country_num)
    # 拆分_country_dict.key()的序號,將序號1234和原key寫入新的字典country_dict,用於判斷輸入是否爲省份編號
        country_dict[country_num]={"sort_num":country_num,"country_name":_country}
    #    print(country_dict.keys())
        c.append(_country)
#        print(c)

    # print(c) # c列表打印的結果['1.河南省', '2.河北省', '3.湖南省', '4.湖北省']
    # 提供交互式界面給用戶輸入省份編號信息
    country_number = input("請輸入要查詢的省份編號:(退出:q)")
    # 打印省份和城市分割線
    print('---------------------------------------------------')
    # 若是用戶輸入的是q,則退出查詢
    if country_number == 'q':
        print('已退出查詢!')
        break

    # 若是沒有輸入q,則有兩種狀況:1)查詢到身份列表,則把省份信息傳遞給district()函數作進一步查詢;2)提示用戶輸入的編號有錯誤
    else:
        # 遍歷c列表中的省份信息,保存到country中
        for country in _country_dict.keys():
            if country_number in country_dict.keys():
                # 將遍歷到的C列表的省份信息同用戶輸入的省份編號進行對比
                # 若是輸入的編號和省份編號一致,則把country的值賦予給province,從而方便進一步查詢特定省份下面的城市列表
             #   province = country
                province = country_dict[country_number]['country_name']
                # 若是符合上面的條件,則開始執行函數,此函數的目的是在現有查詢的基礎上進一步查詢城市和區縣信息
                district()
                # print(country_number) # 測試用戶交互式輸入信息
                break
        else:
            print("您輸入的省份編號有誤,請從新輸入!")
相關文章
相關標籤/搜索