zoukankan      html  css  js  c++  java
  • 老男孩Day1作业(二):编写多级菜单

    要求:编写多级菜单

    1.三级菜单

    2.可依次进入各子菜单

    3.菜单能够回到上一级

    4.用到知识点:字典、列表、多层循环、函数


    1)编写思路

    编写思路参考下面GitHub链接中的流程图

    https://github.com/ChuixinZeng/PythonStudyCode/blob/master/PythonCode-OldBoy/Day1/作业/Day1_作业_多级菜单流程图.png


    2)具体实现

      1 # -*- coding:utf-8 -*-
      2 
      3 # Author:Chuixin Zeng
      4 
      5 # 使用字典保存省份、市、县列表
      6 # 这是一个多级的字典,可以通过for查询每一个级别的信息,级别:省份、市、区
      7 
      8 _country_dict = {
      9     '1.河南省': {
     10         '1.郑州市': {'1.金水区': ['区号100', '邮编400000'], '2.中原区': ['区号101', '邮编400001'], '3.二七区': ['区号102', '邮编400002']},
     11         '2.洛阳市': {'1.老城区': ['区号200', '邮编200000'], '2.洛龙区': ['区号201', '邮编200001'], '3.西工区': ['区号203', '邮编200002']},
     12         '3.信阳市': {'1.浉河区': ['区号300', '邮编300000'], '2.平桥区': ['区号301', '邮编300001'], '3.固始区': ['区号203', '邮编200002']}
     13     },
     14     '2.河北省': {
     15         '1.石家庄市': {'1.长安区': ['区号400', '邮编500000'], '2.新华区': ['区号401', '邮编500001'], '3.桥西区': ['区号402', '邮编500002']},
     16         '2.保定市': {'1.竞秀区': ['区号500', '邮编600000'], '2.莲池区': ['区号501', '邮编600001'], '3.满城区': ['区号503', '邮编600002']},
     17         '3.邯郸市': {'1.丛台区': ['区号600', '邮编700000'], '2.邯山区': ['区号601', '邮编700001'], '3.复兴区': ['区号602', '邮编700002']}
     18     },
     19     '3.湖南省': {
     20         '1.长沙市': {'1.芙蓉区': ['区号700', '邮编800000'], '2.岳麓区': ['区号701', '邮编800001'], '3.雨花区': ['区号702', '邮编800002']},
     21         '2.常德市': {'1.武陵区': ['区号800', '邮编900000'], '2.鼎城区': ['区号801', '邮编900001'], '3.未知区': ['区号803', '邮编900002']},
     22         '3.湘潭市': {'1.丛台区': ['区号900', '邮编110000'], '2.邯山区': ['区号901', '邮编110001'], '3.复兴区': ['区号902', '邮编110002']}
     23     },
     24     '4.湖北省': {
     25         '1.武汉市': {'1.江岸区': ['区号110', '邮编810000'], '2.江汉区': ['区号111', '邮编810001'], '3.汉阳区': ['区号112', '邮编810002']},
     26         '2.宜昌市': {'1.西陵区': ['区号120', '邮编910000'], '2.点军区': ['区号121', '邮编910001'], '3.夷陵区': ['区号123', '邮编910002']},
     27         '3.孝感市': {'1.孝南区': ['区号130', '邮编120000'], '2.孝感区': ['区号131', '邮编120001'], '3.未知区': ['区号132', '邮编120002']}
     28     }
     29 }
     30 
     31 
     32 # 定义一个函数,用于将查询到的省份信息传递给此函数
     33 
     34 def district():
     35     while True:
     36         # 定义一个空列表,用于保存城市信息
     37         cy = []
     38         # %s是处理对象的一种方法,是占位符,它的值来源于后面的% province省份的值,然后通过print打印出来
     39         # province的值是在查询身份的语句里面定义的
     40         print('%s 有以下城市:' % province)
     41         # 通过for循环将用户选择的省份下面的城市列表放到_city中
     42         for _city in sorted(_country_dict[province].keys()):
     43             # 打印用户选择的省份下面的城市的列表
     44             print(_city)
     45             # 将用户选择的省份下面的城市列表附加保存到cy列表中
     46             cy.append(_city)
     47         # print(cy)
     48         # 提供交互式界面,让用户输入要查询的城市编号
     49         _city_number = input('请输入要查询的城市编号:(后退:b 退出:q)')
     50         # 打印城市和区县列表的分隔符
     51         print('---------------------------------------------------')
     52         # 如果用户输入的编号是q,则退出查询
     53         if _city_number == 'q':
     54             print('已退出查询!')
     55             exit()
     56         # 如果用户输入的是b,则中断当前的判断,退回到上一级省份目录
     57         elif _city_number == 'b':
     58             break
     59         else:
     60             # 如果用户输入的是正确的编号,则从cy城市列表中获取到城市信息,放到city中
     61             for city in cy:
     62                 # 判断用户输入的城市编号和cy列表中的城市编号是否匹配
     63                 if _city_number in city:
     64                     # 如果匹配,则将当前城市的名称保存到_citynumber变量中
     65                     _citynumber = city
     66                     # %s是处理对象的一种方法,是占位符,它的值来源于% _citynumber具体城市的值,然后通过print打印出来
     67                     print('%s 该城市有下列区县:' % _citynumber)
     68 
     69                     # 通过while循环,将具体城市下面的区县信息查出来
     70                     while True:
     71                         # 用于保存区县信息的列表
     72                         n = []
     73                         # 通过for循环将用户选择的城市下面的区县列表放到_districts中
     74                         for _districts in sorted(_country_dict[province][_citynumber].keys()):
     75                             # 打印区县的名称信息,例如二七区
     76                             print(_districts)
     77                             # 将区县信息保存到n列表中
     78                             n.append(_districts)
     79                         # 提供交互式界面,让用户输入区县的查询行为
     80                         _phone_number = input('请输入要查询的区县的编号:(后退:b 退出:q)')
     81                         # # 打印区县和区县具体信息列表的分隔符
     82                         print('---------------------------------------------------')
     83                         # 如果用户输入了q,则结束查询
     84                         if _phone_number == 'q':
     85                             print('已结束查询!')
     86                             exit()
     87                         # 如果用户输入了b,则返回到上一级查询
     88                         elif _phone_number == 'b':
     89                             break  # 跳出当前循环,回到上一级循环
     90                         else:
     91                             # 通过循环遍历从区县列表n中读取区县信息到pn中
     92                             for pn in n:
     93                                 # 如果用户输入的区县编号和pn中的区县编号匹配
     94                                 if _phone_number in pn:
     95                                     # 则将具体匹配到的区县的名称保存到phone_number中
     96                                     phone_number = pn
     97                                     # %s的值来源于% _phone_number具体区县的值,然后通过print打印出来
     98                                     print('%s 的信息如下:' % phone_number)
     99                                     # 通过for循环将用户选择的具体的区县的列表中的信息放到p中
    100                                     for p in _country_dict[province][_citynumber][phone_number]:
    101                                         # 打印具体区县下面的邮政编码和区号信息
    102                                         print(p)
    103                                     # 打印查询分隔符
    104                                     print('---------------------------------------------------')
    105                                     # 通过交互式界面询问用户,是否继续查询
    106                                     _end_get = input('查询已完成,是否继续其他查询?(继续:Y 其他:结束)')
    107                                     # 如果用户输入的是大写的Y,则返回到上一级继续查询
    108                                     if _end_get == 'Y':
    109                                         break
    110                                     # 如果用户输入除了大写Y以外其他的值,则结束查询
    111                                     else:
    112                                         print('已结束查询!')
    113                                         exit()
    114                             # 如果用户输入的区县编号有误,提示用户重新输入
    115                             else:
    116                                 print('区县编号输入错误,请重新输入')
    117                     # 第三个while True循环的退出
    118                     break
    119     # 如果用户输入的城市编号不对,则提示用户重新输入
    120     else:
    121         print('城市编号输入有误,请重新输入!')
    122     # 第二个while True不设置中断条件,用户可以退回到当前的城市查询列表中
    123 
    124 while True:
    125 
    126     # 初始化空列表,用于保存省份信息
    127     c = []
    128     # 从国家字典中取第一级列表每一行的值,循环放到_country中
    129     for _country in sorted(_country_dict.keys()):
    130         # 逐行输出国家字典里第一级列表每一行的值
    131         print (_country)
    132         '''
    133         打印效果
    134         1.河南省
    135         2.河北省
    136         3.湖南省
    137         4.湖北省
    138     '''
    139         # 将取到的第一级列表每一行的值追加放入c列表中
    140         c.append(_country)
    141     # print(c) # c列表打印的结果['1.河南省', '2.河北省', '3.湖南省', '4.湖北省']
    142     # 提供交互式界面给用户输入省份编号信息
    143     country_number = input("请输入要查询的省份编号:(退出:q)")
    144     # 打印省份和城市分割线
    145     print('---------------------------------------------------')
    146     # 如果用户输入的是q,则退出查询
    147     if country_number == 'q':
    148         print('已退出查询!')
    149         break
    150 
    151     # 如果没有输入q,则有两种情况:1)查询到身份列表,则把省份信息传递给district()函数做进一步查询;2)提示用户输入的编号有错误
    152     else:
    153         # 遍历c列表中的省份信息,保存到country中
    154         for country in c:
    155             if country_number in country:
    156                 # 将遍历到的C列表的省份信息同用户输入的省份编号进行对比
    157                 # 如果输入的编号和省份编号一致,则把country的值赋予给province,从而方便进一步查询特定省份下面的城市列表
    158                 province = country
    159                 # 如果符合上面的条件,则开始执行函数,此函数的目的是在现有查询的基础上进一步查询城市和区县信息
    160                 district()
    161                 # print(country_number) # 测试用户交互式输入信息
    162                 break
    163         else:
    164             print("您输入的省份编号有误,请重新输入!")
    165 # 第一个while True不设置中断条件,用户可以退回到当前的身份查询列表中

    3)Github笔记

    第一天的笔记的地址是:

    https://github.com/ChuixinZeng/PythonStudyCode/tree/master/PythonCode-OldBoy/Day1/随堂练习

    第一天作业的地址是:

    https://github.com/ChuixinZeng/PythonStudyCode/tree/master/PythonCode-OldBoy/Day1/作业


     4)Readme.md文档

    https://github.com/ChuixinZeng/PythonStudyCode/blob/master/PythonCode-OldBoy/Day1/作业/Readme_多级菜单.md

  • 相关阅读:
    单例 全局变量
    平安亲人 测试数据
    UIButton
    apple id
    背景图的按钮
    大头针飘移问题
    图文并茂Windows系统使用XAMPP搭建本地mysql数据库导入数据库并使用node.js访问数据库
    JS原生上传文件,读取文件格式,控制文件只可以上传某些格式,并使用fileReader转换格式
    今天学到的新知识使用localtunnel实现内网穿透,感觉很神奇哇~~
    在Mac OS上将Node.js连接到XAMPP MySQL服务器一直报错error connecting: Error: connect ECONNREFUSED
  • 原文地址:https://www.cnblogs.com/ChuixinZeng/p/JamieZeng_Day1_list.html
Copyright © 2011-2022 走看看