项目一:模拟购物车
声明:
项目代码纯粹本人自己编写,无任何抄袭、转载等情况,所以写的很low,仅供大家参考
项目要求:
- 用户先给自己的账户充钱:比如先充3000元。
- 有如下的一个格式:
goods = [
{"name": "电脑", "price": 1999},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 20},
{"name": "美女", "price": 998},
]
- 页面显示序号 + 商品名称 + 商品价格,如:1 电脑 1999
- 用户输入选择的商品序号,然后打印商品名称及商品价格, 并将此商品,添加到购物车(自己定义购物车),用户还可继续添加商品。
- 如果用户输入的商品序号有误,则提示输入有误,并重新输入。
- 用户输入N为购物车结算,依次显示用户购物车里面的商品,数量及单价,若充值的钱数不足,则让用户删除某商品,直至可以购买,若充值的钱数充足,则可以直接购买。
- 用户输入Q或者q退出程序。
- 退出程序之后,依次显示用户购买的商品,数量,单价,以及此次共消费多少钱,账户余额多少,并将购买信息显示。
源码:
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("输入金额有误,请重新输入!")