学习记录2:python实现简单购物车程序(结算时带选择物品的数量)

这篇博客讲述了如何使用Python实现一个购物车程序,包括显示商品列表、用户输入预算、余额检查、商品去重等功能。在用户选择商品时,程序会检查余额并更新购物车。遇到的问题包括列表去重和代码整洁性,通过定义函数和使用字典来优化解决方案。虽然代码仍有改进空间,但基本实现了预期功能。此外,还提到了用户输入非数值可能导致的错误未处理情况。
摘要由CSDN通过智能技术生成

(一)先说说题目

学习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、没有考虑到用户输入非数值的情况,如果直接输入字母会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值