zoukankan      html  css  js  c++  java
  • Python作业之多级菜单

                                                      作业之多级菜单

    菜单实现要求:

    1. 列出菜单选择供选择

    2. 选择对应内容进入下一级菜单

    3. 任何时候都可以选择退出程序或返回上一级菜单

    具体代码如下:

    goods = {'华为':{'A系':{'A1':[1000,1100,1200,],'A2':[2000,2100,2200,],'A3':[3000,3100,3200,],},
                     'B系':{'B1':[4000,4200,4400,],'B2':[5000,5200,5400,],'B3':[6000,6200,6400,],},
                     'C系':{'C1':[7000,7300,7600,],'C2':[8000,8300,8600,],'C3':[9000,9300,9600,],},},
               '小米':{'M系':{'M1':[610,630,650,],'M2':[710,730,750,],'M3':[810,830,850,],},
                     'N系':{'N1':[920,950,980,],'N2':[1020,1050,1080,],'N3':[1120,1150,1180],},
                     'L系':{'L1':[1230,1270,1300,],'L2':[1430,1470,1500,],'L3':[1630,1670,1700,],},},
               '魅族':{'X系':{'X1':[599,699,799,],'X2':[699,799,899,],'X3':[799,899,999,],},
                     'Y系':{'Y1':[1099,1199,1299,],'Y2':[1299,1399,1499,],'Y3':[1499,1599,1699,],},
                     'Z系':{'Z1':[2099,2199,2299,],'Z2':[2399,2499,2599,],'Z3':[2699,2799,2899,],},},}
    print('欢迎来到购物商城!'.center(30,'*'))
    lie = [goods,]#声明一个列表,把上述的字典昨晚列表的元素
    def goods_lie(goods,n):
        '''该函数为多级菜单进入和返回的函数,函数有3个返回值,均是返回函数本事(调用递归)。'''
        if n > 0:
            while True:
                for index,phone in enumerate(goods,1):#使用枚举函数遍历字典的键
                    print(index,phone)
                print('温馨提示:
    1.选择商品编号进入下一级菜单
    2.选择B或者b返回上一级菜单
    3.选择Q或者q退出商城')
                choice = input('请选择您要购买的商品编号进入下一级菜单:').strip()
                if choice.isdigit():#判断输入的信息是否是纯数字
                    if int(choice) in range(1,4):
                        if type(goods) != dict:#判断传入的参数是否不是字典类型
                            print('商品的价格为%s已加入到购物车!'% goods[int(choice)-1])
                            back = input('已经最后一级菜单了,请选择返回或者退出!:').strip()
                            if back == 'B' or  back == 'b':
                                return goods_lie(lie[n-1],n-1)#调用函数本身,获取上一次函数执行的结果
                            elif back == 'Q' or back == 'q':
                                break
                            else:
                                print('请选择返回或者退出!')
                                continue
                        else:
                            price = list(goods.keys())[int(choice)-1]#获取商品编号对应的商品
                            lie.append(goods[price])#把商品字典添加到列表中
                            print('您选择的商品是:',price)
                            return goods_lie(goods[price],n+1)#调用函数本身,进入下一级菜单
                    else:
                        print('商品编号不存在,请重新输入!')
                        continue
                else:
                    if choice == 'B' or choice == 'b':
                        print('已返回上一级菜单!')
                        return goods_lie(lie[n-1],n-1)#调用函数本身,获取上一次函数执行的结果
                    elif choice == 'Q' or choice == 'q':
                        print('已退出购物商城!')
                        break
                    else:
                        print('您的输入有误,请重新输入!')
                        continue
    ret = goods_lie(goods,1)#赋值并调用函数
    

    注:该代码实现功能是:输入相应的编号进入下一级菜单或返回上一级菜单执行的结果,也可以虽然退出程序,使用了递归。

    多级菜单优化版

    import os
    if not os.path.exists('d:\users\three_menu.txt'):
        f = open('d:\users\three_menu.txt','w')
        f.write('''{'华为':{'A系':{'A1':[1000,1100,1200,],'A2':[2000,2100,2200,],'A3':[3000,3100,3200,],},
                         'B系':{'B1':[4000,4200,4400,],'B2':[5000,5200,5400,],'B3':[6000,6200,6400,],},
                         'C系':{'C1':[7000,7300,7600,],'C2':[8000,8300,8600,],'C3':[9000,9300,9600,],},},
                   '小米':{'M系':{'M1':[610,630,650,],'M2':[710,730,750,],'M3':[810,830,850,],},
                         'N系':{'N1':[920,950,980,],'N2':[1020,1050,1080,],'N3':[1120,1150,1180],},
                         'L系':{'L1':[1230,1270,1300,],'L2':[1430,1470,1500,],'L3':[1630,1670,1700,],},},
                   '魅族':{'X系':{'X1':[599,699,799,],'X2':[699,799,899,],'X3':[799,899,999,],},
                         'Y系':{'Y1':[1099,1199,1299,],'Y2':[1299,1399,1499,],'Y3':[1499,1599,1699,],},
                         'Z系':{'Z1':[2099,2199,2299,],'Z2':[2399,2499,2599,],'Z3':[2699,2799,2899,],},},}''')
        f.close()
    with open('d:\users\three_menu.txt','r') as f:
        menus = eval(f.read())#把文件中的内容读到内存中并转化为内存中的数据类型
        print('欢迎来到购物商城!'.center(30,'*'))
        menu = []#声明以空列表来存储上一级菜单
        while True:
            dic = {}#声明一个空字典,方便后续操作
            for index,good in enumerate(menus,1):#使用枚举函数遍历字典的键
                print(index,good)
                dic[index] = good#把序号作为字典的key,商品名称作为字典的value传入该字典中
            print('温馨提示:
    1.选择商品编号进入下一级菜单
    2.选择B或者b返回上一级菜单
    3.选择Q或者q退出商城')
            if type(menus) == list:#判断要枚举的菜单是否是列表类型
                choose = input('33[31m请选择你要购买的商品编号:33[0m').strip()
                if choose.isdigit():#判断输入的是否是纯数字
                    if  int(choose) <= len(menus):
                        print('您选择的%s已加入购物车!'% menus[int(choose)-1])
                        print('33[31m最后一级菜单,只能返回和退出!33[0m')
                    else:
                        print('out range')
                else:
                    if choose == 'q' or choose == 'Q':
                        print('已退出购物商城!')
                        break
                    elif choose == 'b' or choose == 'B':
                        menus = menu[-1]#把菜单赋值给列表的最后一个元素
                        menu.pop()#删掉列表的最后一个元素
                    else:
                        print('error')
            else:
                choice = input('请选择您要购买的商品编号进入下一级菜单:').strip()
                if choice.isdigit():
                    if int(choice) in dic.keys():
                        menu.append(menus)#把菜单添加到列表中
                        menus = menus[dic[int(choice)]]#重新赋值菜单
                    else:
                        print('range out')
                else:
                    if choice == 'B' or choice == 'b':
                        print('由于当前处于首层菜单,因此本次返回将退出程序!')
                        if len(menu) < 1:break
                        menus = menu[-1]#把菜单赋值给列表的最后一个元素
                        menu.pop()#删掉列表的最后一个元素
                    elif choice == 'Q' or choice == 'q':
                        print('已退出购物商城!')
                        break
                    else:
                        print('您的输入有误,请重新输入!')
    

    注:主要优化点为:

    1. 把菜单存储到文件中
    2. 简化代码
    3. 弃用递归(递归效率偏低)
  • 相关阅读:
    nginx学习(十):nginx搭建2台tomcat集群
    IOT设备SmartConfig实现
    AIDL原理分析
    MySQL升级-CentOS6.8
    CentOS更新yum源
    .net core微服务通信——gRPC(下)
    .net core微服务通信——gRPC(上)
    实时web应用方案——SignalR(.net core)
    redis常见Bug及雪崩、穿透、击穿解析
    asp.net core托管到windows服务
  • 原文地址:https://www.cnblogs.com/single-boy/p/7503528.html
Copyright © 2011-2022 走看看