Python 模拟购物车的实例讲解
作者:doreimi 发布时间:2021-01-13 05:24:08
1.功能简介
此程序模拟用户登陆商城后购买商品操作。可实现用户登陆、商品购买、历史消费记查询、余额和消费信息更新等功能。首次登陆输入初始账户资金,后续登陆则从文件获取上次消费后的余额,每次购买商品后会扣除相应金额并更新余额信息,退出时也会将余额和消费记录更新到文件以备后续查询。
2.实现方法
架构:
本程序采用python语言编写,将各项任务进行分解并定义对应的函数来处理,从而使程序结构清晰明了。主要编写了六个函数:
(1)login(name,password)
用户登陆函数,实现用户名和密码验证,登陆成功则返回登陆次数。
(2)get_balance(name)
获取用户余额数据。
(3)update_balance(name,balance)
更新用户余额数据,当用户按q键退出时数据会更新到文件。
(4)inquire_cost_record(name)
查询用户历史消费记录。
(5)update_cost_record(name,shopping_list)
更新用户消费记录,当用户按q键退出时本次消费记录会更新到文件。
(6)shopping_chart()
主函数,完成人机交互,函数调用,各项功能的有序实现。
主要操作:
(1)根据提示按数字键选择相应选项进行操作。
(2)任意时刻按q键退出退出登陆,退出前会完成用户消费和余额信息更新。
使用文件:
(1)userlist.txt
存放用户账户信息文件,包括用户名、密码、登陆次数和余额。每次用户登陆成功会更新该用户登陆次数,每次按q键退出时会更新余额信息。
(2)***_cost_record.txt
存放某用户***消费记录的文件,用户首次购买商品后创建,没有购买过商品的用户不会产生该文件。每次按q键退出时会将最新的消费记录更新到文件。
3.流程图
4.代码
# Author:Byron Li
#-*-coding:utf-8-*-
'''----------------------------------------------使用文件说明----------------------------------------------------------
使用文件说明
userlist.txt 存放用户账户信息文件,包括用户名、密码、登陆次数和余额
***_cost_record.txt 存放某用户***消费记录的文件,用户首次购买商品后创建,没有购买过商品的用户不会产生该文件
---------------------------------------------------------------------------------------------------------------------'''
import os
import datetime
def login(name,password): #用户登陆,用户名和密码验证,登陆成功则返回登陆次数
with open('userlist.txt', 'r+',encoding='UTF-8') as f:
line = f.readline()
while(line):
pos=f.tell()
line=f.readline()
if [name,password] == line.split()[0:2]:
times=int(line.split()[2])
line=line.replace(str(times).center(5,' '),str(times+1).center(5,' '))
f.seek(pos)
f.write(line)
return times+1
return None
def get_balance(name): #获取用户余额数据
with open('userlist.txt', 'r',encoding='UTF-8') as f:
line = f.readline()
for line in f:
if name == line.split()[0]:
return line.split()[3]
print("用户%s不存在,无法获取其余额信息!"%name)
return False
def update_balance(name,balance): #更新用户余额数据
with open('userlist.txt', 'r+',encoding='UTF-8') as f:
line = f.readline()
while(line):
pos1=f.tell()
line=f.readline()
if name == line.split()[0]:
pos1=pos1+line.find(line.split()[2].center(5,' '))+5
pos2=f.tell()
f.seek(pos1)
f.write(str(balance).rjust(pos2-pos1-2,' '))
return True
print("用户%s不存在,无法更新其余额信息!" % name)
return False
def inquire_cost_record(name): #查询用户历史消费记录
if os.path.isfile(''.join([name,'_cost_record.txt'])):
with open(''.join([name,'_cost_record.txt']), 'r',encoding='UTF-8') as f:
print("历史消费记录".center(40, '='))
print(f.read())
print("".center(46, '='))
return True
else:
print("您还没有任何历史消费记录!")
return False
def update_cost_record(name,shopping_list): #更新用户消费记录
if len(shopping_list)>0:
if not os.path.isfile(''.join([name, '_cost_record.txt'])): #第一次创建时第一行标上“商品 价格”
with open(''.join([name, '_cost_record.txt']), 'a',encoding='UTF-8') as f:
f.write("%-5s%+20s\n" % ('商品', '价格'))
f.write(''.join([datetime.datetime.now().strftime('%c'), ' 消费记录']).center(40,'-')) #写入消费时间信息方便后续查询
f.write('\n')
for product in shopping_list:
f.write("%-5s%+20s\n"%(product[0],str(product[1])))
else:
with open(''.join([name, '_cost_record.txt']), 'a',encoding='UTF-8') as f:
f.write(''.join([datetime.datetime.now().strftime('%c'), ' 消费记录']).center(40, '-'))
f.write('\n')
for product in shopping_list:
f.write("%-5s%+20s\n"%(product[0],str(product[1])))
return True
else:
print("您本次没有购买商品,不更新消费记录!")
return False
def shopping_chart(): #主函数,用户交互,函数调用,结果输出
product_list=[
('Iphone',5000),
('自行车',600),
('联想电脑',7800),
('衬衫',350),
('洗衣机',1000),
('矿泉水',3),
('手表',12000)
] #商店商品列表
shopping_list=[] #用户本次购买商品列表
while(True):
username = input("请输入用户名:")
password = input("请输入密码:")
login_times=login(username,password) #查询输入用户名和密码是否正确,正确则返回登陆次数
if login_times:
print('欢迎%s第%d次登陆!'.center(50,'*')%(username,login_times))
if login_times==1:
balance = input("请输入工资:") #第一次登陆输入账户资金
while(True):
if balance.isdigit():
balance=int(balance)
break
else:
balance = input("输入工资有误,请重新输入:")
else:
balance=int(get_balance(username)) #非第一次登陆从文件获取账户余额
while(True):
print("请选择您要查询消费记录还是购买商品:")
print("[0] 查询消费记录")
print("[1] 购买商品")
choice=input(">>>")
if choice.isdigit():
if int(choice)==0: #查询历史消费记录
inquire_cost_record(username)
elif int(choice)==1: #购买商品
while (True):
for index,item in enumerate(product_list):
print(index,item)
choice=input("请输入商品编号购买商品:")
if choice.isdigit():
if int(choice)>=0 and int(choice)<len(product_list):
if int(product_list[int(choice)][1])<balance: #检查余额是否充足,充足则商品购买成功
shopping_list.append(product_list[int(choice)])
balance = balance - int(product_list[int(choice)][1])
print("\033[31;1m%s\033[0m已加入购物车中,您的当前余额是\033[31;1m%s元\033[0m" %(product_list[int(choice)][0],balance))
else:
print("\033[41;1m您的余额只剩%s元,无法购买%s!\033[0m" %(balance,product_list[int(choice)][0]))
else:
print("输入编号错误,请重新输入!")
elif choice=='q': #退出账号登陆,退出前打印本次购买清单和余额信息,并更新到文件
if len(shopping_list)>0:
print("本次购买商品清单".center(50,'-'))
for product in shopping_list:
print("%-5s%+20s"%(product[0],str(product[1])))
print("".center(50, '-'))
print("您的余额:\033[31;1m%s元\033[0m"%balance)
update_cost_record(username,shopping_list)
update_balance(username, balance)
print("退出登陆!".center(50, '*'))
exit()
else:
print("您本次没有消费记录,欢迎下次购买!")
print("退出登陆!".center(50, '*'))
exit()
else:
print("选项输入错误,请重新输入!")
else:
print("选项输入错误,请重新输入!")
elif choice=='q': #退出账号登陆
print("退出登陆!".center(50, '*'))
exit()
else:
print("选项输入错误,请重新输入!")
break
else:
print('用户名或密码错误,请重新输入!')
shopping_chart() #主程序运行
来源:http://www.cnblogs.com/byron-li/archive/2017/09/10/7502210.html


猜你喜欢
- 前言Python环境的搭建这里就不赘述了,有需要的小伙伴可以在网上搜罗出很多教程,注意安装PyChom编辑工具。这次我们主要讲一下几点内容:
- 如何验证信用卡是否可用,合法? 核实信用卡的真伪是一件麻烦的事儿,看看下面的代码,也许会给你帮上忙:<Script 
- 方法一、input标签上传如果是input标签,可以直接输入路径,那么可以直接调用send_keys输入路径,这里不做过多赘述,前文有相关操
- 键盘事件废话不多说直接上包from selenium.webdriver.common.keys import Keys1、删除键 BACK
- 问题场景:vue页面初始化展示请求后台返回的数据失败,没有报错<el-form-item label="有效日期"
- MySQL:Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEM1:错误日志大量错误150602 14:40:02 [Warning] Unsafe statement written to the bi
- AddHeaderAddHeader 方法用指定的值添加 HTML 标题。该方法常常向响应添加新的 HTTP 标题。它并不替代现有的同名标题
- 1. txt文件(1) 单位矩阵即主对角线上的元素均为1,其余元素均为0的正方形矩阵。在NumPy中可以用eye函数创建一个这样的二维数组,
- 这篇文章主要介绍了Python zip函数打包元素实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 0. dockerfile命令FROM # 基础镜像,一切从这里开始构建MAINTAINER # 镜像是谁写的,姓名+邮箱RUN# 镜像构建
- 摘要在上一篇文章,时间日期处理的入门里面,我们简单介绍了一下载pandas里对时间日期的简单操作。下面将补充一些常用方法。时间日期的比较假设
- 1. 介绍 SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧
- 在开始之前还是提一下三个函数吧:"ob_start()、ob_end_clean()、ob_get_contents()"
- 主要要文件有:Index.html 实现功能,一个文本框,输入内容并实现提示 search.asp 查询功能,让文本框输入的内容在
- 本文实例为大家分享了Django1.11自带分页器Django的具体使用方法,供大家参考,具体内容如下接下来我编写一个 views ,名cl
- <?php header(“Content-Type:text/html;charset=utf-8″); if (isset($_G
- 本文实例讲述了Go语言算法之寻找数组第二大元素的方法。分享给大家供大家参考。具体如下:该算法的原理是,在遍历数组的时,始终记录当前最大的元素
- Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可能是目
- TensorFlow-gpu1.安装Anaconda进入官网(https://www.anaconda.com/) ->get sta
- 文章介绍了flask框架中的cookie和session。Session是在服务器端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存