1、题目

根据以下数据结构:

goods = [
{"name": "电脑", "price": 1999},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 20},
{"name": "美女", "price": 998},
......
]

实现功能要求:
1、启动程序后,让用户输入工资,然后进入循环,打印商品列表和编号
2、允许用户根据商品编号选择商品
3、用户选择商品后,检测余额是否够,够就直接扣款,并加入购物车, 不够就提醒余额不足
4、可随时退出,退出时,打印已购买商品和余额

2、 分析题目
2.1、分析数据结构
goods = [
{"name": "电脑", "price": 1999},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 20},
{"name": "美女", "price": 998},
......
]

可以看出,这个数据结构是以列表为基础,但是列表的每个元素是字典,感觉是暗藏玄机,当然,不用慌,认清自己的定位:python初学者,这里说的初学者的意思就是我们看到这个数据结构,不要想它是一个很难的结构,也不要想着自己要写一个方法拆解它,当然,能写是最好的。作为初学者的思路是:可以从列表的自身方法找突破点,先抛开题目,如果只有这个数据结构,那我们是不是会好奇列表的方法真的可以取出来里面的元素吗?那就来试试呗~

goods = [
{"name": "电脑", "price": 1999},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 20},
{"name": "键盘", "price": 998},
{"name": "手机", "price": 2999},
{"name": "眼镜", "price": 800},
{"name": "显示器", "price": 1999}]

print(goods[2])
print(goods[3])
####################################################
		########### 输出结果 ############
{'name': '游艇', 'price': 20}
{'name': '键盘', 'price': 998}

可以看到使用下标的方法,取出来每个下标对应的元素,那再思考一下,如何取出name、price的值元素呢?这时候可以看看列表中自带的方法,如下:

python写购物车搜索物品功能 python写简单购物车_python


可以看到第一个就是get方法,那我们可以试一试,如下:

print(goods[2].get("name"))
游艇

试出来了,那么取到具体数据的事情就可以做到了。

2.2、需要用到哪些知识
1. 输入工资、用户选择商品:使用input函数
 2. 循环打印商品:用到for...in...进行循环
 3. 可随时退出:使用到while循环与break
 4. 打印商品:使用print函数
 5. 扣款:涉及对数据的加减操作

除以上零碎的知识点外,还有对整个正序逻辑的把控,例如:先干什么,再干什么,在哪里终止,在哪里提示这些。
我的想法:先拆解需求,将这几点要求拆解为自己可以实现的零碎程序,再根据条件将这些零碎的程序放在该放的位置,那么这个程序就完成了。

3、解答题目

我的最终答案如下所示:
其实有考虑到如果输入除Q/q以外的其他字母会出现报错,也有去尝试使用正则解决这个问题,但是最后一个大佬说不必太在乎这些东西,实际开发中会有人做着些,最重要的一点:写程序时不要太在意输入输出。

goods = [
{"name": "电脑", "price": 1999},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 20},
{"name": "键盘", "price": 998},
{"name": "手机", "price": 2999},
{"name": "眼镜", "price": 800},
{"name": "显示器", "price": 1999}]

print(goods[2].get("name"))
print(goods[3].get("price"))

salary = input("请输入工资:")
sal = salary
for index,item in enumerate(goods):
    print(index + 1, item.get("name"), item.get("price"))
print("请选择商品信息,可根据编号选择商品!")
rmb = []
buyGoods = []

while True:
    ipugood = input("请输入商品序号(输入Q|q即可退出):")
    if ipugood.lower() == "q":
        print("本次共消费{}元!".format(sum(rmb)))
        break
    else :
        if match:
            continue
    ipugood = int(ipugood)
    if ipugood in range(1,len(goods)+1):
        print("您已选购了{}商品".format(goods[ipugood-1].get("name")))
        buyGoods.append(goods[ipugood-1].get("name"))
        rmb.append(goods[ipugood-1].get("price"))
        if sum(rmb) <= int(sal):
            salary = int(sal) - int(goods[ipugood-1].get("price"))
        else:
            rmb.remove(goods[ipugood-1].get("price"))
            print("您选购的商品已经超出您的支付范围!")
            print("您目前购买的商品有:", end="")
            for i in buyGoods:
                print( i, end="、")
            print("本次共消费{}元!".format(sum(rmb)))
            break

测试一下:

游艇
998
请输入工资:1999
1 电脑 1999
2 鼠标 10
3 游艇 20
4 键盘 998
5 手机 2999
6 眼镜 800
7 显示器 1999
请选择商品信息,可根据编号选择商品!
请输入商品序号(输入Q|q即可退出):2
您已选购了鼠标商品
请输入商品序号(输入Q|q即可退出):3
您已选购了游艇商品
请输入商品序号(输入Q|q即可退出):4
您已选购了键盘商品
请输入商品序号(输入Q|q即可退出):5
您已选购了手机商品
您选购的商品已经超出您的支付范围!
您目前购买的商品有:鼠标、游艇、键盘、手机、本次共消费1028元!
4、总结
for index,item in enumerate(goods)

这句程序使用了python中拆包和装包的知识,我第一次也是卡在如何或者编号这里,不知道在哪里加编号更合理一些,后来知道了这个方法,还是有些收获的。另外一个就是列表的sum()方法,我一直不知道python竟然真的可以这么方便,如果一个列表中的元素都是数字的话,那么直接可以使用sum()方法对这列表的元素进行求和。

rmb = []
sum(rmb)

遇到难题,先想一想,做自己可以做的那一部分,其他的可以通过查资料,请教大佬来解决!