购物车程序应该是这十几天正式开始学python做的第一个稍有难度综合性练习。
程序要求:
'''
1.自定义一个商品列表,并按以下格式打印该列表
e.g.:
------ 商品列表 ------
0 iphone 6888
1 MacPro 14800
2 小米6 2499
3 Coffee 31
4 Book 60
5 Nike 699
2. 提示用户输入预算,并在每次购买时查看余额是否充足。
不足时,提示“余额不足”。
3. 根据上面的products列表写一个循环,不断询问用户想买什么,
用户选择一个商品编号,就把对应的商品添加到购物车里,
最终用户输入q退出时,打印购买的商品列表。
4. 购买结束时,输出全部购买产品的编码、名称、单价和数量,
并在最后集中显示“总计”和“余额”
例如:
请输入您的预算:10000
------ 商品列表 ------
0 iphone 6888
1 MacPro 14800
2 小米6 2499
3 Coffee 31
4 Book 60
5 Nike 699
请选择您要购买的商品编码:1
您的余额不足。
------ 商品列表 ------
0 iphone 6888
1 MacPro 14800
2 小米6 2499
3 Coffee 31
4 Book 60
5 Nike 699
请选择您要购买的商品编码:0
已将iphone放入购物车。
------ 商品列表 ------
0 iphone 6888
1 MacPro 14800
2 小米6 2499
3 Coffee 31
4 Book 60
5 Nike 699
请选择您要购买的商品编码:q
------ 购物清单 ------
编码 商品名称 单价 数量
0 iphone 6888 1
----------------------------
总金额 6888元
找零 3112元
感谢您的惠顾。
```
'''
实践过程:
第一次尝试:
一开始无从下手,只勉强完成了第一步、第二步,在后两步思考了很长时间,经过各种试错,才勉强使整个程序能运行。
有些小瑕疵,比如预支金额不足时仍在购物小票中添加商品数量、同一商品多次重复占用多个序号、购物清单的内容不对齐等。
products = [["iphone",6888],["MacPro",14800],["小米13",4299],
["Coffee",30],["Book",60],["Nike",699],["G-SHOCK GA-400GB-1A9",1299],
["HP Elitebook AMD",6299],["Casio fx-999 CNCW",169]]
#TODO:输出商品列表
def menu ():
print("{:-^18}".format(" 商品列表 "))
for i in range(9):
a = f"{i+1} {products[i][0]} {products[i][1]}"
print(a)
i +=1
a
#TODO:添加购物小票开头
def shoplist():
print("{:-^20}".format(" 购物小票 "))
print("序号 商品名称 单价 数量")
#TODO: 不重复的往购物小票中添加商品项
def func(x):
list1 = []
for i in x:
if i not in list1:
list1.append(i)
return list1
#TODO: 添加商品
sum_money = 0
all_money = int(input("请输入您预支付的金额:"))
quantity = {}
shoplist1 = []
menu ()
while True:
KeyIn = input("\n请选择您要选购的商品(请选择商品前的编号(1-6),退出请按'q'):")
if KeyIn != 'q':
for i in KeyIn:
quantity[i] = KeyIn.count(i)
products[int(i)-1].append(quantity[i])
shoplist1.append(products[int(i)-1])
sum_money += products[int(i)-1][1]
#TODO: 超出则弹出购物车中最后一个商品,并在商品总金额中减去相应金额
if sum_money > all_money:
print("{:*^25}".format("余额不足"))
shoplist1.pop()
sum_money -= products[int(i)-1][1]
#TODO: 如未超出,则添加商品,并展示当前商品总额
else:
print(f"已将{products[int(i)-1][0]}放入购物车")
print('总计:',sum_money)
shoplist()
for a,b in enumerate(func(shoplist1)):
print(a+1,b[0],b[1],b.count(1))
#TODO: 展示最终购物小票
else:
shoplist()
for a,b in enumerate(func(shoplist1)):
print(a+1,b[0],b[1],f"{b.count(1)}件")
print('-' * 30)
print(f"总计: {sum_money}元")
print(f"找零: {all_money -sum_money}元")
print("感谢您的光临!\n")
exit()
第二次尝试:
处理了预支金额不足时仍在购物小票中添加数量、同一商品多次重复占用多个序号两个小问题。
products = [["iphone",6888],["MacPro",14800],["小米13",4299],["Coffee",30]
,["Book",60],["Nike",699],["G-SHOCK GA-400GB-1A9",1299],
["HP Elitebook 845 Gen 10 AMD",6299],["Casio fx-999 CNCW",169]]
quantity = {}
shop_basket = []
def itemlist():
print(" 商品列表 ".center(18,'-'))
for i in range(9):
print(f"{i+1} {products[i][0]} {products[i][1]}")
i += 1
def shop_list():
print("购物小票".center(18, '-'))
print("序号 商品名 单价 数量")
def func1(x):
list1 = []
for i in x :
if i not in list1:
list1.append(i)
return list1
# TODO:添加商品
sum_money = 0
budget = int(input("请输入您的预支付金额:"))
itemlist()
while True:
input1 =input("请您输入选择所需商品(输入商品序号1~9,如需退出,请输入'q'。):")
if input1 != 'q':
#TODO:添加商品数量
for i in input1:
quantity[i] = input1.count(i)
products[int(i)-1].append(quantity[i])
sum_money += products[int(i)-1][1]
shop_basket.append(products[int(i)-1])
# TODO: 如超出预支付金额,舍弃购物车内最后一个商品
if sum_money > budget:
print("余额不足".center(20,"x"))
sum_money -= products[int(i)-1][1]
print("当前余额:",budget - sum_money)
shop_basket.pop()
products[int(i)-1][2] -= 1
# TODO: 如果预支付金额足够,则添加该件商品,并显示余额以及正在创建的购物小票
else:
print(f"{products[int(i)-1][0]}已添加至您的购物车中。")
print("余额:",budget-sum_money)
shop_list()
for a,b in enumerate(func1(shop_basket)):
print(a+1,b[0],b[1],b.count(1))
else:
print("最终的购物小票如下:\n")
shop_list()
for a,b in enumerate(func1(shop_basket)):
print(a+1,b[0],b[1],b.count(1))
print("-" * 40)
print("总金额", sum_money)
print("找零:", budget - sum_money)
print("感谢您的光临,祝您生活愉快!")
exit()
不足/改进之处:
-代码过于凌乱,不够美观 (希望大佬指点)
-购物清单的内容不对齐
-对一些函数的用法还不熟悉,对字符串的格式化处理掌握欠佳