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

    科技2022-09-04  100

    (一)先说说题目

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

    Processed: 0.009, SQL: 12