项目一:模拟购物车

声明:

项目代码纯粹本人自己编写,无任何抄袭、转载等情况,所以写的很low,仅供大家参考

项目要求:

  1. 用户先给自己的账户充钱:比如先充3000元。
  2. 有如下的一个格式:
goods = [
	{"name": "电脑", "price": 1999},
    {"name": "鼠标", "price": 10}, 
    {"name": "游艇", "price": 20},
    {"name": "美女", "price": 998}, 
    ]
  1. 页面显示序号 + 商品名称 + 商品价格,如:1 电脑 1999
  2. 用户输入选择的商品序号,然后打印商品名称及商品价格, 并将此商品,添加到购物车(自己定义购物车),用户还可继续添加商品。
  3. 如果用户输入的商品序号有误,则提示输入有误,并重新输入。
  4. 用户输入N为购物车结算,依次显示用户购物车里面的商品,数量及单价,若充值的钱数不足,则让用户删除某商品,直至可以购买,若充值的钱数充足,则可以直接购买。
  5. 用户输入Q或者q退出程序。
  6. 退出程序之后,依次显示用户购买的商品,数量,单价,以及此次共消费多少钱,账户余额多少,并将购买信息显示。

源码:

goods = [{"name": "电脑", "price": 1999},
         {"name": "鼠标", "price": 10},
         {"name": "游艇", "price": 20},
         {"name": "美女", "price": 998}, ]
shopping_trolley = []  # 购物车
bill = []  # 结算账单
print("欢迎来到商城".center(18, "*"))
while True:
    money = input("请充值金额:")
    if money.isdigit() and int(money) > 0:  #  必须是大于0的整数
        print(f"本次您充值的金额为:{money}元")
        print("商品信息".center(18, "*"))
        for i, el in enumerate(goods, 1):  # 枚举解包出序号
            value_lst = list(el.values())
            print(f"序号:{i} 商品:{value_lst[0]} 价格:{value_lst[1]}")
        while True:
            number = input("请输入你想购买的商品序号(按N结算,按Q退出):")
            if number.upper() != "Q":
                if number.isdigit() and 0 < int(number) < len(goods) + 1:
                    number = int(number)
                    commodity = (number, goods[number - 1]["name"], goods[number - 1]["price"])  # 选中的物品打包
                    shopping_trolley.append(commodity)  # 加到购物车中
                    print(f"商品:{goods[number - 1]['name']} 价格:{goods[number - 1]['price']}")  # 格式化输出购买的商品
                elif number.upper() == "N":  # 结算
                    if shopping_trolley == []:
                        print("购物车中无商品,请重新选择商品!")
                    else:
                        print("\n"+"您已选择以下商品".center(18, "*"))
                        price_sum = 0  # 总价格初始化
                        remove_repeat = set(shopping_trolley)  # 去重购物车
                        for el in remove_repeat:
                            time = shopping_trolley.count(el)  # 计算重复商品出现的次数
                            num, name, price = el  # 解包元组
                            print(f"商品:{name} 价格:{price} 数量:{time}")
                            price_sum = price_sum + price * time  # 计算价格
                        while True:
                            if price_sum > int(money):
                                print("\n您充值的金额不足,请选择删除购物车中的商品!")
                                print("\n"+"购物车".center(18, "*"))
                                choose_num = []
                                remove_repeat = set(shopping_trolley)  # 重复代码,目的再次展示一边购物车的东西
                                for el in remove_repeat:
                                    time = shopping_trolley.count(el)
                                    num, name, price = el
                                    choose_num.append(num)  # 将购物车中的商品序号都加进去,一会删除时判断用
                                    print(f"序号:{num} 商品:{name} 价格:{price} 数量:{time}")  # 再次展示一边购物车的东西
                                number = input("请输入你想删除的商品序号:")
                                if number.isdigit() and int(number) in choose_num:  # 判断输入的序号在不在购物车中
                                    if len(shopping_trolley) > 1:
                                        for i in range(len(shopping_trolley)):
                                            if shopping_trolley[i][0] == int(number):
                                                price_sum = price_sum - shopping_trolley[i][2]
                                                shopping_trolley.pop(i)  # 删除
                                                break  # 每次只删一个,所以不存在循环列表删不干净的问题
                                    else:  # 此时购物车中只剩一件商品
                                        shopping_trolley.clear()  # 直接清空就好了
                                        print("购物车中无商品!")
                                        price_sum = 0  # 商品总价清零
                                        break
                                else:
                                    print("您输入的序号有误,请重新输入!")
                            else:
                                choose = input("您的金额充足,确认是否购买(是/否)?")
                                if choose == "是":
                                    print("购买成功!")
                                    for el in shopping_trolley:
                                        bill.append(el)  # 将结算的商品加到账单里去
                                    shopping_trolley.clear()  # 清空购物车
                                    price_sum = 0  # 商品总价归零
                                    break
                                elif choose == "否":
                                    shopping_trolley.clear()
                                    print("已清空购物车!")
                                    break
                                else:
                                    print("您的输入有误,请重新输入!")
                else:
                    print("您输入的序号有误,请重新输入!")
            else:
                print("结算清单".center(18, "*"))
                print("本次您购买的商品如下:")
                shopping_trolley.clear()
                price_sum = 0
                remove_repeat = set(bill)  # 账单去重
                for el in remove_repeat:
                    time = bill.count(el)  # 计算账单中重复商品的数量
                    num, name, price = el
                    print(f"商品:{name} 数量:{time} 价格:{price}")
                    price_sum = price_sum + price * time
                money = int(money) - price_sum  # 剩余金额
                print(f"本次共消费:{price_sum}元\n账户余额为:{money}元\n已清空您的购物车,欢迎您下次光临!")
                break
        break
    else:
        print("输入金额有误,请重新输入!")