python购物车优化
一.需求分析
- 拥有用户接口和商家接口
- 用户能够进行消费记录查询,充值,购物等功能,消费记录存储于数据库
- 商家可以进行商品的增删改等操作
二.程序流程图
程序大致流程图如下:

三.代码实现
本程序分成两部分,生成两个py函数,分别是DataAccess_txt.py和ShoopingCar.py,DataAccess_txt.py函数主要是用于编写一些数据库的操作接口,比如增删改操作,用户数据查询存储等操作。ShoopingCar.py用户主函数的编辑与处理,话不多说上代码:
DataAccess_txt.py程序代码如下:
import time#导入模块方法,用于系统时间获取 #查询数据库中的数据
def search_data_access():
goods=[]
fp = open('goods_info.txt','r')#打开商品信息表
lines = fp.readlines()
for line in lines:
goods.append(line.rstrip('\n').split(' '))#清楚格式转换成列表
for i in range(len(goods)):
print('%s 价格 :%s 库存 :%s'%(goods[i][0],goods[i][1],goods[i][2])) #删除商品操作
def delet_goods_opt(GoodName):
goods=[]
fp = open('goods_info.txt','r')
lines = fp.readlines()
for line in lines:
goods.append(line.rstrip('\n').split(' '))#清楚格式转换成列表
# for i in range(len(goods)):
# print('%s 价格 :%s 库存 :%s'%(goods[i][0],goods[i][1],goods[i][2]))
for i in range(len(lines)):
if GoodName == goods[i][0]:
print("删除商品%s成功!"%goods[i][0])
goods.remove(goods[i])
fp.close()
fp = open('goods_info.txt', 'w')
for i in range(len(goods)):
fp.write(' '.join(goods[i]) + '\n')
fp.close()
return
print("没有此商品信息,删除失败!") #添加商品操作
#参数说明:goodname 商品名 prace 价格 Num 库存量
def add_goods_opt(GoodName,prace,Num):
goods = []
fp = open('goods_info.txt', 'r')
lines = fp.readlines()
for line in lines:
goods.append(line.rstrip('\n').split(' ')) # 清楚格式转换成列表
T = False
for i in range(len(goods)):
if goods[i][0] == GoodName:
T = True
print("商品已存在,添加失败!")
return
Info = GoodName+' '+str(prace)+' '+str(Num)+'\n'
fp.close()
fp = open('goods_info.txt', 'a')
fp.write(Info)
fp.close()
print("添加商品%s成功!" %GoodName ) #修改商品参数
#参数说明:goodname 商品名 prace 价格 Num 库存量
def Change_goods_info(GoodName,prace,Num):
goods = []
fp = open('goods_info.txt', 'r')
lines = fp.readlines()
for line in lines:
goods.append(line.rstrip('\n').split(' ')) # 清楚格式转换成列表
for i in range(len(goods)):
if goods[i][0] == GoodName:
goods[i][1] = str(prace)
goods[i][2] = str(Num)
fp.close()
fp = open('goods_info.txt', 'w')
for i in range(len(goods)):
fp.write(' '.join(goods[i]) + '\n')
fp.close()
print("商品%s参数修改成功!"%(GoodName))
return
print("数据库中没有此商品,修改失败!") #查余额
def user_printAccountBalance(GoodName):
user_info=[]
fp = open('users_value.txt', 'r')
lines = fp.readlines()
for line in lines:
user_info.append(line.rstrip('\n').split(' ')) # 清除格式转换成列表
for i in range(len(user_info)):
if user_info[i][0] == GoodName:
print("\033[32;1m%s\033[0m的账户余额 :\033[32;1m%s\033[0m"%(GoodName,user_info[i][1]))
return #充值
# UserName :用户名,充值金额 :新老用户标识 新用户为True老用户为False
def user_TopUp(UserName,Value):
user_info = []
fp = open('users_value.txt', 'r')
lines = fp.readlines()
for line in lines:
user_info.append(line.rstrip('\n').split(' ')) # 清除格式转换成列表
for i in range(len(user_info)):
if user_info[i][0] == UserName:
user_info[i][1]=str(int(user_info[i][1])+Value)
fp.close()
fp = open('users_value.txt', 'w')
for temp in range(len(user_info)):
fp.write(' '.join(user_info[temp]) + '\n')
fp.close()
print("充值成功\033[32;1m%s\033[0m当前的账户余额 :\033[32;1m%s\033[0m" % (UserName, user_info[i][1]))
return
user_info = UserName + ' ' + str(Value) + '\n' # +' '+ (str(time.ctime())).replace(' ','')+'\n'
fp = open('users_value.txt', 'a')
fp.write(user_info)
fp.close()
print("新用户充值成功\033[32;1m%s\033[0m当前的账户余额 :\033[32;1m%s\033[0m" % (UserName, Value)) #查询用户消费记录
def user_RecordsConsumption(GoodName):
user_info = []
fp = open('users_info.txt', 'r')
lines = fp.readlines()
fp.close()
for line in lines:
user_info.append(line.rstrip('\n').split(' ')) # 清除格式转换成列表
T = False
for i in range(len(user_info)):
if GoodName == user_info[i][0]:
T=True
print('用户 :\033[32;1m%s\033[0m 购物清单 :%s 消费 :%s 日期 :%s'%(user_info[i][0],user_info[i][1],user_info[i][2],user_info[i][3]))
if T==False:
print("用户\033[32;1m%s\033[0m无消费记录!"%GoodName) #购物车
def user_ShoopCar(Username):
goods_info = []
ShoopCar = [] # 创建购物车列表
expense=0
fp = open('goods_info.txt', 'r')
f = open('users_value.txt','r')
ValueAccess = f.readlines()
lines = fp.readlines()
f.close()
fp.close()
for line in ValueAccess:
if line.split(' ')[0] == Username:
Salary = int(line.split(' ')[1])
for line in lines:
goods_info.append(line.rstrip('\n').split(' ')) # 清除格式转换成列表
while True:
for i, index in enumerate(goods_info):
print(i, index)
getNum = input("请输入要购买的商品编号,结算输入q :")
if getNum.isdigit():
getNum=int(getNum)
if Salary >= int(goods_info[getNum][1]):
ShoopCar.append(goods_info[getNum][0])
Salary = Salary - int(goods_info[getNum][1])
expense += int(goods_info[getNum][1])
if int(goods_info[getNum][2]) > 0:
goods_info[getNum][2] = str(int(goods_info[getNum][2])-1)
print("当前余额为 :\033[31;1m%s\033[0m"%Salary)
else:
print("余额不足!")
elif getNum=='q':
f = open('users_info.txt', 'a')
f.write( Username + ' ' + ','.join(ShoopCar) +' '+ str(expense) +' '+(str(time.ctime())).replace(' ','')+'\n')
f.close()
f = open('goods_info.txt', 'w')
for i in range(len(goods_info)):
f.write(' '.join(goods_info[i]) + '\n')
f.close()
value_info=[]
f = open('users_value.txt', 'r')
lines = f.readlines()
for line in lines:
value_info.append(line.rstrip('\n').split(' ')) # 清除格式转换成列表
f.close()
for i in range(len(value_info)):
if value_info[i][0] == Username:
value_info[i][1] = str(Salary)
f = open('users_value.txt', 'w')
for i in range(len(value_info)):
f.write(' '.join(value_info[i]) + '\n')
f.close()
break
else:
pass
ShoopingCar.py程序代码如下:
import DataAccess_txt#要导入DataAccess_txt.py这个模块 while True:
Num=input("1.用户界面,2.商家界面,输入q退出 :")
if Num.isdigit():
Num = int(Num)
if Num == 1:
username = input("Please Input The Username :")
DataAccess_txt.user_printAccountBalance(username)
while True:
UserChoose = input("1.查询购物记录,2.购物,3.充值,输入q返回上级目录 :")
if UserChoose.isdigit():
UserChoose = int(UserChoose)
if UserChoose == 1:
DataAccess_txt.user_RecordsConsumption(username)#查询购物记录
elif UserChoose == 2:
DataAccess_txt.user_ShoopCar(username)#购物车
elif UserChoose == 3:
value = int(input("请输入充值金额 :"))
DataAccess_txt.user_TopUp(username,value)#充值
elif UserChoose=='q':
break
else:
pass elif Num == 2:#商家界面
DataAccess_txt.search_data_access()#打印商品信息和库存
while True:
UserChoose = input("1.添加商品,2.修改商品信息,3.删除商品,输入q返回上级目录 :")
if UserChoose.isdigit():
UserChoose = int(UserChoose)
if UserChoose==1:
goodsname=input("请输入商品名 :")
goodsvalue=int(input("请输入商品价格 :"))
goodnum = int(input("请输入商品数量 :"))
DataAccess_txt.add_goods_opt(goodsname,goodsvalue,goodnum)#商品添加操作
elif UserChoose==2:
goodsname = input("请输入要修改的商品名 :")
goodsvalue = int(input("请输入商品价格 :"))
goodnum = int(input("请输入商品数量 :"))
DataAccess_txt.Change_goods_info(goodsname, goodsvalue,goodnum)
elif UserChoose==3:
goodsname = input("请输入要删除的商品名 :")
DataAccess_txt.delet_goods_opt(goodsname)
elif UserChoose=='q':
break
else:
pass
else:
pass
elif Num == 'q':
break
else:
pass
要注意的是必须要记得导入模块,不然没有办法使用自己编写的数据操作接口,ShoopingCar.py的第一行代码就是模块的导入,调用DataAccess_txt.py的数据操作接口时,以delet_goods_opt()删除商品信息接口为例,调用方法是DataAccess_txt.delet_goods_opt()。
数据库文件截图如下:

users_vlaue.txt文件存储的第一个数据参数为用户名,第二个参数为用户余额,参数之间用空格隔开

users_info.txt文件存储的第一个数据参数为用户名,第二个参数为用户购物商品记录,第三个参数为消费总数,第四个参数为日期

goods_info.txt文件存储的第一个数据参数为商品名,第二个参数为商品价格,第三个参数为库存总数
python购物车优化的更多相关文章
- 简单的python购物车
这几天,一直在学python,跟着视频老师做了一个比较简单的python购物车,感觉不错,分享一下 products = [['Iphone8',6888],['MacPro ...
- python性能优化
注意:本文除非特殊指明,”python“都是代表CPython,即C语言实现的标准python,且本文所讨论的是版本为2.7的CPython. python为什么性能差: 当我们提到一门编程语言的 ...
- Python内存优化
实际项目中,pythoner更加关注的是Python的性能问题,之前也写过一篇文章<Python性能优化>介绍Python性能优化的一些方法.而本文,关注的是Python的内存优化,一般说 ...
- python 购物车小程序
python 购物车小程序 功能要求:1.启动程序后,输入用户名密码后,让用户输入工资,然后打印商品列表2.允许用户根据商品编号购买商品3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒4. ...
- Python内存优化:Profile,slots,compact dict
实际项目中,pythoner更加关注的是Python的性能问题,之前也写过一篇文章<Python性能优化>介绍Python性能优化的一些方法.而本文,关注的是Python的内存优化,一般说 ...
- Python性能优化(转)
分成两部分:代码优化和工具优化 原文:http://my.oschina.net/xianggao/blog/102600 阅读 Zen of Python,在Python解析器中输入 import ...
- python的优化机制与垃圾回收与gc模块
python属于动态语言,我们可以随意的创建和销毁变量,如果频繁的创建和销毁则会浪费cpu,那么python内部是如何优化的呢? python和其他很多高级语言一样,都自带垃圾回收机制,不用我们去维护 ...
- python购物车小案例
python购物车小案例# 案列描述:有一个小型水果店里面有水果(苹果:¥8/kg,香蕉:¥5/kg,芒果:¥15/kg,葡萄:¥12/kg),客户带了100元钱进店选购水果.# 1.客户输入相应序号 ...
- Python性能优化方案
Python性能优化方案 从编码方面入手,代码算法优化,如多重条件判断有限判断先决条件(可看 <改进python的91个建议>) 使用Cython (核心算法, 对性能要求较大的建议使用C ...
随机推荐
- log4j与logback包冲突原因及解决,不可忽视的Warning
场景 一个简单的spring-boot程序,需要用kafka做消息队列,于是在maven中引入kafka依赖,一切看似没问题,在启动时,打印出Warning信息: SLF4J: Class path ...
- ansible批量修改用户密码
实现批量修改目标主机多个用户密码: --- - hosts: testchanange passwd gather_facts: false tasks: - name: change you pas ...
- C++练习 | 二分练习
Codeforces 371C : Hamburgers #include<bits/stdc++.h> using namespace std; char B='B',S='S',C=' ...
- MySQL->索引的维护[20180504]
学习MySQL数据库中表的索引维护(新增和删除) 索引的好处: 提高查询的效率 可限定特定的资料(如唯一) 索引的不足: ...
- 什么是ajax和json,说说他们的优缺点
ajax异步传输的js和xml.实现页面无刷新状态更新页面和异步提交 所谓异步,简单解释就是:向服务器发送请求的时候,我们不必等待结果,而是同时做其他的事情,等到有了结果后它自己会根据设定进行后续操作 ...
- ionic ios 打包
1.安装Xcode 从appstore 安装就行 2.安装node.js 3.安装cordova 由于权限问题 网络问题 可以考虑一下方式 1️⃣使用淘宝镜像 npm install ...
- Struts2速记手册
工作原理 Action类 Action类 普通Action类 私有属性及getter.setter(处理请求参数) execute()方法(处理请求) 实现Action接口 提供常量 继承Ac ...
- Hadoop源码学习笔记之NameNode启动场景流程五:磁盘空间检查及安全模式检查
本篇内容关注NameNode启动之前,active状态和standby状态的一些后台服务及准备工作,即源码里的CommonServices.主要包括磁盘空间检查. 可用资源检查.安全模式等.依然分为三 ...
- dns欺骗之ettercap
ettercap是一个基于ARP地址欺骗方式的网络嗅探工具,主要适用于局域网. ettercap是一款现有流行的网络抓包软件,它利用计算机在局域网内进行通信的ARP协议的缺陷进行攻击,在目标与服务器之 ...
- golang基础--Gocurrency并发
Go并发特点 goroutine只是由官方实现的超级"线程池"而已,每个实例4-5kb的栈内存占用和用于实现机制而大幅减少的创建和销毁开销. 并发不是并行(多CPU): Concu ...