(一)先说说题目
学习python第10天。
关于python实现购物车程序,网上已经有很多了,但是看了一圈,都是打印商品列表,用户选择,最后打印出所选物品的总金额。但是,这道题如果要加上余额,加上计数,实现比较跟现实相贴近的状况,至少我没找到。
题目如下:
products = [["iphone",6888],["MacPro",14800],["小米6",2499],["Coffee",31],["Book",60],["Nike",699]],需打印出以下格式:
------ 商品列表 ------
0 iphone 6888
1 MacPro 14800
2 小米6 2499
3 Coffee 31
4 Book 60
5 Nike 699
2. 提示用户输入预算,并在每次购买时查看余额是否充足。不足时,提示“余额不足”。
(1)根据上面的products列表写一个循环,不断询问用户想买什么,用户选择一个商品编号,就把对应的商品添加到购物车里,最终用户输入q退出时,打印购买的商品列表。
(2)购买结束时,输出全部购买产品的编码、名称、单价和数量,并在最后集中显示“总计”和“余额”
例如:
请输入您的预算: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],["小米6",2499],["Coffee",31],["Book",60],["Nike",699]]
budget = all_money = int(input("请输入预算:"))
cart = {}
shopping = []
def function(): # 循环显示商品列表
print("商品列表".center(15, "-"))
for i, x in enumerate(products):
print(i+1, x[0], x[1])
continue
def function2(): # 购物车顶部显示
print("购物车列表".center(15, "-"))
print("编号 名称 价格 数量")
def function6(x): # 列表去重
list1 = []
for i in x:
if i not in list1:
list1.append(i)
return list1
function()
while 1:
a = input("请选择您要购买的商品编码(请选择1-6):")
if a != "q":
for i in a:
cart[i] = a.count(i)
products[int(a)-1].append(cart[i])
shopping.append(products[int(a)-1])
budget = budget - int(products[int(a)-1][1])
if budget < 0:
print("余额不足,请重新输入".center(25, "X"))
shopping.pop()
budget = budget + int(products[int(a)-1][1])
else:
print(f"余额:{budget}元")
print(f"已将{products[int(a) - 1][0]}放入购物车")
function2()
for a, b in enumerate(function6(shopping)):
print(a + 1, b[0], b[1], b.count(1))
else:
print("最终购买清单如下:")
function2()
for a, b in enumerate(function6(shopping)):
print(a + 1, b[0], b[1], b.count(1))
print("-" * 15)
print(f"总计:{all_money - budget}元")
print(f"余额:{budget}元")
print("感谢您的惠顾")
exit()
原来的思维是,用户输入编号,用一个空列表shoping存放每次用户选择的物品。但是,用户可能会重复选择一个物品,比如我选了3次iphone,如果不去重,最终打印出来的效果就类似于这样:
-----购物车列表-----
编号 名称 价格 数量
1 iphone 6888 1
2 iphone 6888 1
3 iphone 6888 1
---------------
而我想实现的是:
-----购物车列表-----
编号 名称 价格 数量
1 iphone 6888 3
---------------
一开始想用set(shoping),但是出现TypeError: unhashable type: 'list'错误,经过https://blog.csdn.net/lyq_12/article/details/81260427扫盲,发现这个没办法解决,只能另外想办法,用function6里的模块去重。
(三) 最后总结
1、代码自己感觉很凌乱,但至少思路感觉还是对的。
2、没有考虑到用户输入非数值的情况,如果直接输入字母会报错。