python写的购物车程序
数据结构: goods = [ {"name": "电脑", "price": 1999}, {"name": "鼠标", "price": 10}, {"name": "游艇", "price": 20}, {"name": "美女", "price": 998}, ...... ] 功能要求: 基础要求: 1、启动程序后,输入用户名密码后,让用户输入工资,然后打印商品列表 2、允许用户根据商品编号购买商品 3、用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 4、可随时退出,退出时,打印已购买商品和余额 5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示 扩展需求: 1、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买 2、许查询之前的消费记录 代码实现:
import copy # 从文件读取用户信息,数据结构为:# id_info=dict(key:用户名,values['密码',余额,历史消费记录[{商品名:价格:数量:},{}],锁定标志位:0未锁定,1锁定])f = open("id_info.txt", 'r', encoding="GBK")id_info = eval(f.read())f.close() # -----------------------------------------------用户登陆模块-------------------------------------------# 新用户登录,输入两遍密码确认;老用户登录则从用户信息表读取帐密校验;同一帐号连续输入三次则锁定,退出程序count = 0user_name = Noneis_same_user = Truelast_login_user = Noneis_login = False while count < 3: user_name = input("请输入用户名:").strip() user_pwd = input("请输入密码:").strip() if last_login_user is None: # 首次登陆 last_login_user = user_name if user_name != last_login_user: # 判断是否连续登陆 is_same_user = False if user_name in id_info: if id_info[user_name][3] == 0: # 判断帐号是否锁定 if user_pwd == id_info[user_name][0]: print("尊敬的\033[1;31;40m%s\033[0m,欢迎登陆路飞商城!" % user_name) is_login = True break else: print("密码错误,请重输!") else: print("用户帐号已冻结,请联系管理员解锁。") else: print("该用户帐号不存在,请联系管理员分配帐号!") count += 1else: print("密码输入错误超过3次!") if is_same_user is True: # 锁定帐号,写入文件保存 id_info[user_name][3] = 1 f = open("id_info.txt", 'w', encoding="GBK") f.write(str(id_info)) f.close() # ---------------------------------------------用户选购商品模块-------------------------------------------# 支持保存和查询全部历史消费记录,当天购物车清单,同时对展示的同类商品进行了数量合并goods = [{"name": "电脑", "price": 1999}, {"name": "鼠标", "price": 10}, {"name": "游艇", "price": 20}, {"name": "美女", "price": 998}, ] cart_history = id_info[user_name][2] # 读取文件传给id_info的历史购物记录 # 初始化本次购物车商品列表,用于按q打印时输出cart = []j = 0while j < len(goods): cart.append({}) j += 1 # 定义打印菜单所需的字符串s = "商品列表"s_c = "本次购物车清单"s_h = "历史消费记录" if is_login: while True: if id_info[user_name][1] is None: # 未输入工资的用户,首次运行程序输入,以后登陆不再输入工资 user_salary = input("请输入工资:").strip() if user_salary.isdigit(): id_info[user_name][1] = int(user_salary) break else: print("工资输入的不是数字,请重输!") else: break # 用户往购物车循环添加商品,加入的商品需同时保存到历史记录,退出时写入文件保存 while True: # 打印商品列表和高亮显示余额 print(s.center(30, '-')) for index, i in enumerate(goods): print("%s. %s 单价:%s元".center(30) % (index, i['name'], i['price'])) print("您账户余额为: \033[1;31;40m%d\033[0m 元".center(38, '-') % id_info[user_name][1]) choice = input("请输入商品数字编号加入购物车,\n查询历史消费记录按h,退出请按q:") if choice.isdigit(): choice_num = int(choice) if 0 <= choice_num < len(goods): if id_info[user_name][1] >= goods[choice_num]['price']: # 余额足够 # 本次购物车无同种商品,则增加关键字num统计同种商品的购买数量 if cart[choice_num].get('num') is None: cart[choice_num] = goods[choice_num] cart[choice_num].setdefault('num', 1) id_info[user_name][1] -= goods[choice_num]['price'] else: cart[choice_num]['num'] += 1 # 如购物车已有同名商品则已购数量加1 id_info[user_name][1] -= goods[choice_num]['price'] # 历史购物记录同时加入本次购物记录 if cart_history[choice_num].get('num') is None: cart_history[choice_num] = copy.deepcopy(goods[choice_num]) cart_history[choice_num].setdefault('num', 1) else: cart_history[choice_num]['num'] += 1 # 如历史记录已有同名商品则已购数量加1 print("\033[1;31;40m商品 %s 已加入购物车!\033[0m" % goods[choice_num]['name']) else: print("对不起,您账户中\033[1;31;40m余额不足\033[0m,不能购买本件商品!") # 余额不足 else: print("您输入的商品数字编号有误,请重新输入:") # 用户输入h,打印全部历史消费清单和余额,含当天已消费的商品 elif choice.casefold() == 'h': empty_num = 4 print(s_h.center(30, '-')) for index, i in enumerate(cart_history): if i != {}: empty_num -= 1 print("%s. %s 单价:%d元 数量:%d" % (index, i['name'], i['price'], i['num'])) if empty_num == 4: print("您还没有任何历史消费记录,欢迎拨打客服\n电话反馈您的商品需求,谢谢!") print("您账户余额为: \033[1;31;40m%d\033[0m 元".center(38, '-') % id_info[user_name][1]) # 用户输入q,打印本次购物车清单和余额,退出程序 elif choice.casefold() == 'q': empty_num = 4 print(s_c.center(30, '-')) for index, i in enumerate(cart): if i != {}: empty_num -= 1 print("%s. %s 单价:%d元 数量:%d" % (index, i['name'], i['price'], i['num'])) if empty_num == 4: print("今天您还没有购买商品,购物车是空的。") print("您账户余额为: \033[1;31;40m%d\033[0m 元".center(38, '-') % id_info[user_name][1]) # 退出前将历史消费记录和余额保存到文件中 id_info[user_name][2] = copy.deepcopy(cart_history) f = open("id_info.txt", 'w', encoding="GBK") f.write(str(id_info)) f.close() break else: print("您输入的不是数字编号!")
转载于:https://www.cnblogs.com/eric99/p/10000136.html
python写的购物车程序相关推荐
- python打开word后再关闭再打开出错_用Python写了个程序调用word,运行完后再手动打开word文档就变慢了,这是为啥?...
公司归档文件比较麻烦,于是用Python写了个程序自动归档,运行无错误.但是运行完后问题就来了,自己手动打开word文档时速度变得奇慢,打开一个文档需要1~2min,请各位同仁帮我看看.下为源代码 # ...
- python实现抽奖软件(一)_详解用python写一个抽奖程序
第一次使用python写程序,确实比C/C++之类方便许多.既然这个抽奖的数据不大,对效率要求并不高,所以采用python写,更加简洁.清晰.方便. 1.用到的模块 生成随机数的模块random 用来 ...
- python抽奖游戏_利用Python写一个抽奖程序,解密游戏内抽奖的秘密
原标题:利用Python写一个抽奖程序,解密游戏内抽奖的秘密 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客 ...
- python写出的程序如何给别人使用-python如何写出表白程序
用python编表白程序的方法: 1.创建GUI窗口,实现代码的调用. 2.编写点击触发函数,实现表白程序. 具体代码如下:from tkinter import * from tkinter imp ...
- python写一个表白程序_用Python写一个能算出自己年龄的小程序
用Python写一个能算出自己年龄的小程序. 其实我连我今年多少岁都不知道,最近看到了python的datetime库里面有很多好用的方法,于是就写了这样一个程序作为练习,然后又写了这样一篇文章来梳理 ...
- python编写ftp客户端_用Python写FTP客户端程序
0 前言: ftp客户端相信大家都用过,那么我们为什么还要用Python写ftp客户端呢? 我想有两个原因: 一是写出更好的ftp客户端应用程序,方便大家使用: 二是定制一些特殊服务,例如每天定时下载 ...
- python开发的gui界面,python写gui应用程序
python 编写gui界面有哪些 安装wxPython下面是wxPython特别基础的使用方法,将以一个小程序为例来说明,它的功能是在一个文本框中输入文件名,点击open按钮,会在另一个文本框中显示 ...
- 学完python写不出程序_我又不当程序员,为什么要学Python编程?
记得刚毕业时,所受的第一场职场教育便是: 职场如战场,战场上只论功劳,不论苦劳. 回想起那时,无数个夜晚披星戴月加班加点,却常常被狠批在做无用功,迷茫与崩溃说来就来,甚至会觉得 " 越努力越 ...
- 用python写一个小程序,解决买水果的问题?
问题: 商店总共有三种水果,香蕉/苹果/葡萄,单价分别为3.5/5.0/3.0元/500克. 写一个小程序实现: 1.输出一个菜单:打印每种水果的价格: 2.寻问客户欲购买水果? 3.客户想购买的克数 ...
最新文章
- char与varchar的区别
- 理性教育~值得借鉴~
- 全球及中国液氦低温恒温器行业竞争调查分析及前景预测报告2021-2027年版
- oracle 物理表,【查询Oracle表实际物理使用大小】
- 块元素与行内元素转化(display属性)
- Matlab里evalin和assignin的用法
- 计算机四级必背知识点,2019年6月计算机四级数据库工程师必备考点
- Repeater嵌套Repeater获取父级绑定项
- Linux系统编程——vfork() 函数详解
- db2数据库基础知识
- STM32串口printf调试输出(SSCOM V5.13.1)
- 防范勒索病毒及关闭相关端口
- PS给人物添加阴影和高光
- 极客日报:腾讯《王者荣耀》禁止未满12周岁用户充值;B站发布16款新品游戏;华为注册姚安娜商标被驳回
- QT 读写CSV文件
- java入门考点_java入门基础知识点总结
- 苹果签名市场变天,频繁封杀到底是什么原因?
- 商业堡垒机是什么意思?有免费版的商业堡垒机吗?
- Simulink —— 三相交流控制系统中的坐标变换
- 删除 git 本地仓库