python课程学习-模块1-作业-02三级菜单

1. 作业需求:

数据结构:

menu = {
    '北京': {
        '海淀': {
            '五道口': {
                'soho': {},
                '网易': {},
                'google': {}
            },
            '中关村': {
                '爱奇艺': {},
                '汽车之家': {},
                'YouKu': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龙观': {},
        },
        '朝阳': {},
        '东城': {},
    },
    '上海': {
        '闵行': {
            "人民广场": {
                '炸鸡店': {}
            }
        },
        '闸北': {
            '火车战': {
                '携程': {}
            }
        },
        '浦东': {},
    },
    '山东': {},
}

需求:
可依次选择进入各子菜单
可从任意一层往回退到上一层
可从任意一层退出程序
所需新知识点:列表、字典

2. 流程图

这里写图片描述

3. Readme

功能:
1. 自定义数据,显示三级菜单信息
2. 在选择列表信息的同时,可以选择退出或者返回上一级
3. 如果在一级或二级菜单下面没有信息了,会有提示,然后返回之前的选择

代码语言
python3.6

版本
version 0.0.1

4. 代码

#!/usr/bin/env python3
# _*_coding:utf-8 _*_
# @author : zpfly
# @Time : 2018/3/16 
# 地址三级菜单

menu = {
    '北京': {
        '海淀': {
            '五道口': {
                'soho': {},
                '网易': {},
                'google': {}
            },
            '中关村': {
                '爱奇艺': {},
                '汽车之家': {},
                'YouKu': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龙观': {},
        },
        '朝阳': {},
        '东城': {},
    },
    '上海': {
        '闵行': {
            "人民广场": {
                '炸鸡店': {}
            }
        },
        '闸北': {
            '火车战': {
                '携程': {}
            }
        },
        '浦东': {},
    },
    '山东': {},
}


# 显示当前级别的可选地点
def show_list(dict_name):
    region = []
    for region_name in dict_name.keys():
        region.append(region_name)
    print(region)
    return region


# 对于用户的选择进行判断
def choice_check(upper_dict):
    # upper_dict参数是上一层区域的字典信息
    choice = input("请输入要查看的区域(q退出,b返回上级):")
    if choice == 'q':
        # 退出
        print("\033[1;31;m退出选择\033[0m")
        exit(1)
    elif choice == 'b':
        # 返回上一级
        return 1
    elif choice in upper_dict:
        # 如果输入
        if len(upper_dict[choice]) == 0:
            print("\033[1;31;m已经没有信息了,返回上一层\033[0m")
            return 3
        return upper_dict[choice]
    else:
        print("\033[1;31;m输入错误,请重新选择\033[0m")
        return 2


# 查看省
while True:
    region_list = show_list(menu)
    result_1 = choice_check(menu)
    if result_1 == 1:
        print("\033[1;31;m已经是最顶层,请重新选择\033[0m")
        continue
    elif result_1 == 2:
        continue
    elif result_1 == 3:
        continue
    else:
        # 查看市
        while True:
            region_list_2 = show_list(result_1)
            result_2 = choice_check(result_1)
            if result_2 == 1:
                break
            elif result_2 == 3 or result_2 == 2:
                continue
            else:
                # 查看区
                while True:
                    region_list_3 = show_list(result_2)
                    result_3 = choice_check(result_2)
                    if result_3 == 1:
                        break
                    elif result_3 == 3 or result_3 == 2:
                        continue
                    else:
                        region_list_4 = show_list(result_3)
                        print("\033[1;31;m当前已经是最后一级\033[0m")
                        result_4 = choice_check(result_3)
                        if result_4 == 2:
                            continue

5. 测试

测试1. 依次进入各子菜单

['北京', '上海', '山东']
请输入要查看的区域(q退出,b返回上级):北京  # 依次选择进入第一二三级菜单
['海淀', '昌平', '朝阳', '东城']
请输入要查看的区域(q退出,b返回上级):海淀
['五道口', '中关村', '上地']
请输入要查看的区域(q退出,b返回上级):五道口
['soho', '网易', 'google']
当前已经是最后一级                        # 在最后一级有提示信息
请输入要查看的区域(q退出,b返回上级):soho  # 在最后一级输入查询信息,会提示,然后返回到上级菜单
已经没有信息了,返回上一层
['五道口', '中关村', '上地']
请输入要查看的区域(q退出,b返回上级):上地
['百度']
当前已经是最后一级
请输入要查看的区域(q退出,b返回上级):百度
已经没有信息了,返回上一层
['五道口', '中关村', '上地']
请输入要查看的区域(q退出,b返回上级):q
退出选择

测试2:输入错误时

['北京', '上海', '山东']
请输入要查看的区域(q退出,b返回上级):beijing  # 输入错误会提示,然后重新输入
输入错误,请重新选择
['北京', '上海', '山东']
请输入要查看的区域(q退出,b返回上级):北京      # b返回上一级
['海淀', '昌平', '朝阳', '东城']
请输入要查看的区域(q退出,b返回上级):b
['北京', '上海', '山东']
请输入要查看的区域(q退出,b返回上级):山东      # 菜单下面没有信息,会返回到上一层有信息的
已经没有信息了,返回上一层
['北京', '上海', '山东']
请输入要查看的区域(q退出,b返回上级):q
退出选择

不足之处与思考:
1. 可以从逻辑流程图很明显的看到,每个循环的流程都极其相似,那么是否可以把代码更加优化呢?
2. 如果进行代码的优化,但是考虑到每个层级出现有一些细微之处不同,而且只有三级菜单,是否有优化的必要呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值