第八章 购物车与三级菜单

购物车与三级菜单

1.购物车

购物车程序:

1.启动程序后,先登录,登录成功则打印商品列表,失败则重新登录,超过三次则密码输入错误3次锁定5秒,请5秒后再登录
2.允许用户根据商品编号购买商品,用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
3.可结账,结账时,打印已购买商品和用户信息

1.1.数据部分

# 1.熟悉python的语法规则,巩固day1到day7的知识点
# 2.业务逻辑
import time
# time.sleep(5)
# print('休息5秒')
user_dic = {
    'name':'大海',
    'password':'123a',
    'locked':False,
    'account':50000,
    'shopping_cart':{}
}

1.2.登录部分

def login():
    '''
        登录函数,密码输入错误3次锁定5秒,用户名输入错误可以一直输入
        :return:
    '''
    print('请登录')
    # 密码错误的次数
    count = 0
    while True:
        # 密码错误三次会走   if user_dic['locked']:
        if user_dic['locked']:
            print('密码输入错误3次锁定5秒,请5秒后再登录')
            time.sleep(5)
            user_dic['locked'] = False
            count = 0
        name = input('输入用户名').strip()
        if name == user_dic['name']:
            pwd = input('输入密码').strip()
            if user_dic['password'] == pwd and user_dic['locked'] == False:
                print('登录成功')
                break
            else:
                print('密码错误')
                count +=1
        else:
            print('用户名不存在')
        if count >= 3:
            user_dic['locked'] = True

1.3.购物部分

# login()

def shopping():
    print('购物')
    goods_list = [
        ['coffee', 30],  # 0
        ['chicken', 20],  # 1
        ['iPhone', 10000],  # 2
        ['car', 100000],  # 3
        ['building', 200000]  # 4
    ]
    shopping_cart = {}
    cost_money = 0
    while True:
        # 展示商品
        # enumerate 枚举
        for i,itme in enumerate(goods_list):
            # i是列表的索引号
            # item是列表里面的数据

            print(i,itme)
            # for循环
        # for循环已经运行完毕
        choice = input('输入商品对应的编号,按t键结账').strip()


        if choice.isdigit():
            # 判断字符串是否是数字
            # 进入了这个里面,字符串的数字
            # print('是数字')
            # 现在输入的是字符串的数字
            choice = int(choice)
            # 否定的条件 不能是那些数字
            if choice < 0 or choice >= len(goods_list):
                print('请输入相应的编号')
                continue
            # print('这个是合法的数字')
            # print(goods_list[choice])
            # # 商品
            # print(goods_list[choice][0])
            # # 价格
            # print(goods_list[choice][1])
            # 商品
            goods_name=goods_list[choice][0]
            # 价格
            goods_price=goods_list[choice][1]
            # 用户的余额大于商品的价格,才可购物
            if user_dic['account']>=goods_price:
                # 购买过这个商品进入if
                if goods_name in shopping_cart:
                    # 第二次购买
                    shopping_cart[goods_name]['count']+=1
                    shopping_cart[goods_name]['price']=goods_price*shopping_cart[goods_name]['count']
                # 第一次购买进入else
                else:
                    shopping_cart[goods_name] = {'price':goods_price,'count':1}
                # print(shopping_cart)
                # 新的账户的金额 = 账户的金额 - 商品的价格
                user_dic['account'] -= goods_price
                # 花费的金额 =  花费的金额(一开始是0) + 商品的价格
                cost_money+=goods_price
                # 提示用户这一次你加入购物车的商品名字
                print('%s新的商品'%goods_name)
            else:
                print('钱不够')
        # 结账部分
        elif choice == 't':
            print('结账')
            print(shopping_cart)
            buy = input('买不买(y/n)>>>').strip()
            if buy == 'y':
                if cost_money == 0:
                    print('不买白看')
                    break
                # 把购物车的信息存到用户信息里面去
                user_dic['shopping_cart']= shopping_cart
                print('%s 花费了%s 购买了%s'%(user_dic['name'],cost_money,shopping_cart))
                print('账号信息%s' % user_dic)
                break
            else:
                print('不买')
                user_dic['account'] = 50000
                break
        else:
            print('非法输入')




shopping()

1.4.登录装饰器

注意

(这个要写到shopping函数的前面,在shopping函数上方加上@login_intter)

# 登录装饰器
def login_intter(func):# func >>>>  shopping
    def wrapper():
        login()
        func()
    return wrapper

2.三级菜单

需求:

打印省、市、县三级菜单
可返回上一级
可随时退出程序

menu = {
    '北京':{
        '海淀':{
            '五道口':{
                '网易':{},
                'google':{}
            },
            '中关村':{
                '爱奇艺':{},
                '汽车之家':{},
                '优酷':{},
            },
            '上地':{
                '百度':{},
            },
        },
        '昌平':{
            '沙河':{
                '北航':{},
            },
            '天通苑':{},
            '回龙观':{},
        },
        '朝阳':{},
        '东城':{},
    },
    '上海':{
        '闵行':{
            "人民广场":{
                '炸鸡店':{}
            }
        },
        '闸北':{
            '火车战':{
                '携程':{}
            }
        },
        '浦东':{},
    },
    '湖南':{
        '长沙':{
            "世界之窗":{
             '岳麓山':{}
            }
        },
        '岳阳':{
            '岳阳楼':{
            }
        },
        '衡阳':{

        },
    },
}

1.简单方式

tag=True
while tag:
    menu1=menu
    for key in menu1: # 打印第一层
        print(key)
    choice1=input('第一层>>: ').strip() # 选择第一层
    if choice1 == 'b': # 输入b,则返回上一级
        break
    if choice1 == 'q': # 输入q,则退出整体
        tag=False
        continue
    if choice1 not in menu1: # 输入内容不在menu1内,则继续输入
        continue
    while tag:
        menu_2=menu1[choice1] # 拿到choice1对应的一层字典
        for key in menu_2:
            print(key)
        choice2 = input('第二层>>: ').strip()
        if choice2 == 'b':
            break
        if choice2 == 'q':
            tag = False
            continue
        if choice2 not in menu_2:
            continue
        while tag:
            menu_3=menu_2[choice2]
            for key in menu_3:
                print(key)
            choice3 = input('第三层>>: ').strip()
            if choice3 == 'b':
                break
            if choice3 == 'q':
                tag = False
                continue
            if choice3 not in menu_3:
                continue
            while tag:
                menu_4=menu_3[choice3]
                for key in menu_4:
                    print(key)
                choice4 = input('第四层>>: ').strip()
                if choice4 == 'b':
                    break
                if choice4 == 'q':
                    tag = False
                    continue
                if choice4 not in menu_4:
                    continue
                # 第四层内没数据了,无需进入下一层

2.(初步实现):能够一层一层进入

layers = [menu, ]
while True:
    current_layer = layers[-1]
    for key in current_layer:
        print(key)
    choice = input('>>: ').strip()
    if choice not in current_layer:
        continue
    # 把提取出来的第二层字典信息添加到列表layers里面
    layers.append(current_layer[choice])

3.(改进):加上退出机制

layers=[menu,]
while True:
    if len(layers) == 0:
        break
    current_layer=layers[-1]
    for key in current_layer:
        print(key)
    choice=input('>>: ').strip()
    if choice == 'b':
        # 删除当前的那一层
        layers.pop(-1)
        continue
    if choice == 'q':
        break
    if choice not in current_layer:
        continue
    layers.append(current_layer[choice])
posted @ 2022-10-26 15:07  adqwe  阅读(8)  评论(0编辑  收藏  举报