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 ...
随机推荐
- If people in the communications only think about gains and losses of interest, then the pleasure of knowing each other will cease to exist.
If people in the communications only think about gains and losses of interest, then the pleasure of ...
- IE盒子模型和W3C盒子模型
IE盒模型出现在ie5.5以下的版本当中,ie6以上就实行W3C盒模型. box-sizing有两个属性,border-box和content-box. border-box对应传统的盒子模型,即ie ...
- Google Chrome 浏览器的备用(离线)安装程序
Google Chrome 浏览器的备用(离线)安装程序(适用于 Windows) 如果您在使用 http://www.google.com/chrome 上的标准安装程序下载 Chrome 浏览器时 ...
- android 代码将数据库文件导出到sd卡
public static void save() { String dbpath = "/data/data/tl.cac.view/databases/" +"afi ...
- Vue.js + Webpack + ECMAScript 6 入门教程
Vue.js学习教程 1.Vue.js——60分钟快速入门 2.Vue.js——60分钟组件快速入门(上篇) 3.Vue.js——60分钟组件快速入门(下篇) 4.Vue.js——基于$.ajax实现 ...
- webservice、soap、wsdl
搜集了一些关于webservice.soap.wsdl的基本知识,解决工作中遇到的疑问 一 .什么是webservice(用你的话描述webservice)?在什么时候用webservice(webs ...
- Protocol Buffer学习教程之语法手册(二)
1.说明 此向导介绍如何使用protocol buffer language创建一个自己的protocolbuffer文件,包括语法与如何通过“.proto”文件生成数据访问的类,此处只介绍proto ...
- jsp跳转标签<jsp:forward>
forward.jsp <%@ page language="java" contentType="text/html; charset=utf-8" p ...
- ABAP和Java单例模式的攻防
ABAP CLASS zcl_jerry_singleton DEFINITION PUBLIC FINAL CREATE PRIVATE . PUBLIC SECTION. INTERFACES i ...
- 从PEP-8学习Python编码风格
(搬运自我在SegmentFault的博客) 关于空行 类与顶级函数(top-level function)的定义之间应当空两行. 类中的方法之间应当空一行. 方法中的逻辑部分之间可以空一行. 关于原 ...