python 学习分享-购物车实操篇
程序要求如下:
- '''购物车程序:
- 启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表
- 允许用户根据商品编号购买商品
- 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
- 可随时退出,退出时,打印已购买商品和余额
- 在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示
- 用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买
- 允许查询之前的消费记录
- '''
做题的整体思路如下,主要是封装了两个函数,然后调用函数,写到主程序中,写完了所有的代码
- '''考虑到程序需要读取用户名、密码、salary、已购物品、物品列表'''
- '''创建了三个文件,一个文件存放用户名、密码、salary,为了判断用户是不是第一次登陆,所以在文件中直接写入salary ='n',第二个文本存放物品清单,第三个文件存放用户名、对应的已购物品、及消费时间'''
- '''创建第一个认证函数,认证用户名、密码,并在成功后,打开第三个文件(已购物品文件),写入到dict中,返回用户字典、已购物品字典、用户名。这里不能用salary是否为n来判断已购文件是否不存在该用户的购物记录。如果用户第一次登陆后输入了salary,但是未购买任何物品,已购清单仍然为空'''
- '''创建第二个物品列表函数,将物品文件中的内容拿出来,组成一个列表'''
- '''编写主程序,验证salary是否为n,消费、查询、退出,最后将内容写回文件中,完成'''
总结
本程序对我这个水平的人来说还是很有难度的,经历了多次改写,更换解题思路,然后又因为对字典、列表、int、str不熟悉,导致写完的程序,各种错误,测试改错又用了很长时间,差不多10多个小时,才完成了这个程序。多练还是有好处的!
代码部分
- '''购物车程序:
- 启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表
- 允许用户根据商品编号购买商品
- 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
- 可随时退出,退出时,打印已购买商品和余额
- 在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示
- 用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买
- 允许查询之前的消费记录
- '''
- import time
- def user_get():
- user_o = open('user.txt','r')
- user_p_m = {}
- for line in user_o.readlines():
- if not line:
- continue
- line_u = line.strip().split()[0]
- user_p_m[line_u] = {}
- user_p_m[line_u]['password']=line.strip().split()[1]
- user_p_m[line_u]['money']=line.strip().split()[2]
- user_o.close()
- count = 0
- while 1:
- username = input('input your username:')
- password = input('input your password:')
- if count < 3:
- if user_p_m.get(username) and user_p_m[username]['password']==password:
- print('Welcome login!')
- break
- else:
- print('your username or password is wrong')
- else:
- print('you have try so many times,you will exit')
- exit()
- count+=1
- sav_goods_o = open('savegoods.txt', 'r')
- sav_d = {}
- for line_s in sav_goods_o.readlines():
- if not line_s:
- continue
- line_k = line_s.strip().split()[0]
- line_vg = line_s.strip().split()[1]
- line_vt = line_s.strip().split()[2]
- if not sav_d.get(line_k):
- sav_d[line_k] = []
- sav_d[line_k].append({line_vg: line_vt})
- sav_goods_o.close()
- return username,user_p_m,sav_d
- def goods_get():
- goods_o = open('goods.txt', 'r')
- goods_d = []
- for line in goods_o.readlines():
- if not line:
- continue
- goods_g = line.strip().split()[0]
- goods_m = line.strip().split()[1]
- goods_d.append([goods_g, goods_m])
- goods_o.close()
- return goods_d
- username,user_d_m,sav_d = user_get()
- goods_d = goods_get()
- goods_t = []
- while 1:
- if user_d_m[username]['money'] == 'n':
- money = input('input your salary:')
- if money.isdigit():
- user_d_m[username]['money'] = int(money)
- else:
- print('\033[34;1m非法\033[0m字符,请重新输入!')
- else:
- user_d_m[username]['money']=int(user_d_m[username]['money'])
- print('商品列表'.center(30,'*'))
- for i in range(len(goods_d)):
- print(i, goods_d[i][0], ' ', goods_d[i][1] + '元')
- print('*'.center(35,'*'))
- goods_num = input('\033[33;1m请输入您需要的商品编号\033[0m\n或者按\033[35;1mh\033[0m查看历史记录,按\033[36;1mq\033[0m键退出程序:')
- if goods_num.isdigit():
- if int(goods_num) in range(len(goods_d)):
- if user_d_m[username]['money']>=int(goods_d[int(goods_num)][1]):
- time_now=time.strftime('%Y-%m-%d',time.localtime(time.time()))
- user_d_m[username]['money']-=int(goods_d[int(goods_num)][1])
- if sav_d.get(username):
- sav_d[username].append({goods_d[int(goods_num)][0]:time_now})
- else:
- sav_d[username]=[{goods_d[int(goods_num)][0]:time_now}]
- goods_t.append(goods_d[int(goods_num)][0])
- print('您购买了\033[32;1m%s\033[0m,花费\033[31;1m%s\033[0m元'%(goods_d[int(goods_num)][0],goods_d[int(goods_num)][1]))
- else:
- print('余额为\033[31;1m%s\033[0m,不足'%(user_d_m[username]['money']))
- else:
- print('您输入的编号\033[34;1m有误\033[0m,请重新输入!')
- else:
- if goods_num == 'h':
- if sav_d.get(username):
- print('您的购买记录如下:\033[32;1m%s\033[0m' %(sav_d[username]))
- else:
- print('您还未购买任何物品')
- elif goods_num == 'q':
- if len(goods_t):
- print('您的余额为\033[31;1m%s\033[0m,您本次购买了\033[32;1m%s\033[0m'%(str(user_d_m[username]['money']),goods_t))
- else:
- print('您的余额为\033[31;1m%s\033[0m,您本次未购买任何商品' % (str(user_d_m[username]['money'])))
- break
- else:
- print('\033[34;1m非法\033[0m字符,请重新输入!')
- user_w = open('user.txt','w')
- for us_l in user_d_m:
- us_l_w = us_l +' '+ user_d_m[us_l]['password']+' '+str(user_d_m[us_l]['money']) + '\n'
- user_w.write(us_l_w)
- user_w.close()
- sav_goods_o = open('savegoods.txt', 'a')
- for goods_save in range(len(goods_t)):
- sa_l_w = username + ' '+ goods_t[goods_save] + ' '+time_now+ '\n'
- sav_goods_o.write(sa_l_w)
- sav_goods_o.close()
- exit()
python 学习分享-购物车实操篇的更多相关文章
- python 学习分享-迭代器与生成器篇
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式.. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...
- HDFS集群PB级数据迁移方案-DistCp生产环境实操篇
HDFS集群PB级数据迁移方案-DistCp生产环境实操篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 用了接近2个星期的时间,终于把公司的需要的大数据组建部署完毕了,当然,在部 ...
- python学习之路网络编程篇(第四篇)
python学习之路网络编程篇(第四篇) 内容待补充
- Python学习之not,and,or篇
Python学习之not,and,or篇 运算符示意 not –表示取反运算. and –表示取与运算. or –表示取或运算. 运算符优先级 not > and > or. 举例如下: ...
- ESP8266 NodeMCU小白手把手入门(实操篇)以土壤湿度和DHT传感器为例讲解读取传感器的值
物联网使得现实世界中的实体和数字世界比以往任何时候都更紧密地联系在一起.NodeMCU作为其中的一个重要设备,作用之一就是与传感器相连以实现万物互联通讯.这篇关于NodeMCU的实操篇以土壤湿度传感器 ...
- python 学习分享-装饰器篇
本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...
- Python关于类的实操
实操一:总结 1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性? 2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性? 3.什么是解除绑定的函数,如何定义,如何调用,给 ...
- Python学习之路【第一篇】-Python简介和基础入门
1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是 ...
- python 学习分享-paramiko模块
paramiko模块学习分享 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.paramiko支持Linux, Solaris, BS ...
随机推荐
- ecshop分类页把分类描述改成FCKeditor编辑器
最近放一个网站 http://www.macklin.cn/productline/35 有个产品分类页面需要添加分类缩略图和图文的描述 一.首先说下添加分类缩略图的步骤吧 1,依葫芦画瓢,参照的是e ...
- ajax在购物车中的应用
代码如下: 购物车页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...
- SharePoint 2013 缺少站点保存为模板选项
如果您尝试在SharePoint Server 2013中保存站点,我们没有看到“将站点另存为模板”选项,则可能是因为该站点已启用站点发布功能.如 之前文章提到 “SharePoint 2010 缺少 ...
- App测试流程及测试点
1 APP测试基本流程 1.1流程图 接收版本 尽快申请到正式环境下测试 不符 App测试版本送测规范 用户行为统计测试 后台订单统计测试 尽快申请到正式环境下测试 兼容性测试.性能压力测试 功能测试 ...
- SQL server的一个分割表值函数
CREATE FUNCTION [dbo].[Fn_Split] ( @SplitString text, -- 如果要传入NText类型,下面需要相应的修改,注释行为NText下同 ) = ','- ...
- vue.js的package.json相关问题解惑
使用vue-cli创建vue.webpack项目,在项目中用到了iSlider移动端滑动插件,只在本地命令工具中npm install islider.js:提交之后,partner下载代码后一直运行 ...
- 融云SDK触达用户数破20亿 王者风范双倍展现
11月1日,融云SDK触达用户数突破20亿,业务增长速度及用户覆盖量再创即时通讯云领域新高.自去年11月10日公布SDK触达用户数破10亿以来,融云仅用了一年时间,便取得了触达用户数翻倍的成绩,迅猛的 ...
- python中os.listdir( )函数读取文件夹
编写pytohn脚本时通常需要批处理. 列出指定目录下的所有文件/文件夹 os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表,但有个很明显的缺点,它的默认顺序不是有序的或 ...
- python 基础之for循环有限循环
# range(3) 表示 >>> range(3) [0, 1, 2] for循环 for i in range(3): print(i) 测试 0 1 2 打印1~100的奇数 ...
- 超全面Java 面试题(2.1)
这部分主要是开源JavaEE框架方面的内容,包括hibernate.MyBatis.spring.Spring MVC等,由于Struts2已经是明日黄花,在这里就不讨论Struts2的面试题,此外, ...