作业要示:

购物车程序:
启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表
允许用户根据商品编号购买商品
用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
可随时退出,退出时,打印已购买商品和余额
在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示
用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买
允许查询之前的消费记录

先上一下流程吧!

具体代码还在优化中》》》先一下与流程图对应的代码吧!

 #!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
import time,sys,os
with open('user_file.txt','r',encoding='utf-8') as user_file:
user_list=eval(user_file.readline())#转换用户文件中的字符串
lock_name=open('lock_name.txt','r+',encoding='utf-8')#打开锁定用户列表文件
lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串 def userchar(_user_name):#检测用户名的函数
while True:
if _user_name in user_list and _user_name not in lock_list:#判断用户是否存在并正常
return True#存在返回真
break
elif _user_name in user_list and _user_name in lock_list:#判断用户是否被锁定
print('您的用户已经被锁定,请联系商家解锁!')
break
else:
print('您输入用户不存在,请先注册')
break def confirm():#退出确认函数
qu=input("是否退出登陆!按\033[31;1mY/y\033[0m退出? 按其它键重新登陆:")
if qu=='Y'or qu=='y':
print("您已经退出!" )
exit()#退出程序
else :
pass def user_pass():
bool=True#定义退出循环条件变量
while bool:
_user_name=(input('请输入用户名:'))
if userchar(_user_name.strip()):#运行检测用户名的函数判断,去除两边空格
count=3#定义锁次数
while count>0 :#如果密码错误次数超过退出密码输入
#password=getpass.getpass('请输入密码:')
password=input('请输入密码:')
if password==user_list[_user_name]:#密码通过验证结束循环
print("密码通过验证")
bool=False
print("欢迎您 \033[32;1m%s\033[0m 您已经登陆成功!" % _user_name)
return _user_name#返回用户名
else:
count -=1#次数减少
print("密码错误请重试,剩余:\033[31;1m%s\033[0m次! "% count)
pass
else:
print("\033[31;1m超出所试次数,账户已锁定!请联系商家!\033[0m")
lock_list.append(_user_name)#将用户名加出锁定列表
lock_name.seek(0)#指针移动到开头,以免产生多个元组
lock_name.write(str(lock_list))#写入锁定用户文件
lock_name.tell()#获取当前指针,以免产生多个元组
lock_name.close()#关闭锁定用户文件
confirm()#退出确认函数
#continue#退回到输入用户名的位置
else:#如果用户名出错新来过
confirm()
pass def infor():#打开用户信息函数
with open('user_infor','r+',encoding='utf-8') as user_infor:#打开用户购物信息文件
infor_list=eval(user_infor.readline())#转换文件的字符串
return infor_list #程序开始:
if os.path.exists('history'):#确认文件是否存在
pass
else:
with open('history','w',encoding='utf-8') as user_history:#创建一个用户帐户购物记录文件
user_history.write('{}')#写入空值
pass if os.path.exists('user_infor'):#确认文件是否存在
pass
else:
with open('user_infor','w',encoding='utf-8') as user_infor:#创建一个用户帐户信息记录文件
user_infor.write('{}')#写入空值
pass print("欢迎来到\033[31;1mpython\033[0m购物商城!")
time_format='%y-%m-%d %X'#定义时间格式
times=time.strftime(time_format)#定义时间
_user_name= user_pass()#将通过验证的用户名赋于变量 if _user_name in infor():#如果用户信息存在记录就跳过
pass
else:
while True:
name_char=input("首次登陆,请输入工资(购物资金):")#用户输入工资(购物资金)
if name_char.isdigit():#检测输入是否为整数
name_char=int(name_char)#转为int
with open('history','r+',encoding='utf-8') as user_history:#打开用户帐户购物记录文件
history_list=eval(user_history.readline())#将文本读为字典
history_list[_user_name]={}#创建用户购物记录
user_history.seek(0)#移到开头
user_history.write(str(history_list))#写入文件
with open('user_infor','r+',encoding='utf-8') as user_infor:
infor_list=eval(user_infor.readline())#转换首登用户文件中的字符串
infor_list[_user_name]={"金额":name_char}
user_infor.seek(0)
user_infor.write(str(infor_list))#写入用户信息
break
else:
print('金额不能为0或负数请正确输入金额!')
continue
#再次登陆直接显示用户信息
infor_list=infor()#获取用户信息字典
name_char=int(infor_list[_user_name]['金额'])#获取余额
with open('history','r',encoding="utf-8") as user_history:#读取用户文件
history_list=eval(user_history.readline())#用户购物信息
shoplist=[]#购物车列表
shop_count=0#购物金额统计
###进入商品列表###
goodsname=[]#定义商品列表
print('用户名:\033[32;1m%s\033[0m:'%_user_name)#输出用户信息
print('您的余额:\033[31;1m%s\033[0m:'%name_char)
history=history_list[_user_name]#用户购物记录信息
print('您的购物记录如下:')
for k,v in history.items():#转为列表进行输出
print(k,v)#输出购物记录
print('加载商品列表:')
#加载动态
for i in range(40):
sys.stdout.write('#')
sys.stdout.flush()
time.sleep(0.05)
print('\n') with open('goodslist.txt','r',encoding='utf-8') as f:#打开商品列表文件
for line in f:
a=line.find(',')#定位分割符的索引进行分割
goodsname.append((line[0:a],int(line[a+1:])))#元组模式追加到列表,价格转为整数 while True:
for index,p_item in enumerate(goodsname):#取出下标输出 商品列表
print(index,p_item)#输出商品列表
user_index=input('请输入商品编号添加你所在购买的商品,按用\033[31;1mq/Q\033[0m退出>>>:')
if user_index.isdigit():#判断是否为整数
user_index=int(user_index)#转为数字
if user_index < len(goodsname) and user_index>=0:#判断所选商品编号在在列表
p_item=goodsname[user_index]#读取下标所在(元素)商品
if p_item[1]<=name_char:#余额是否足够
shoplist.append(p_item)#添加到购物车
name_char-=p_item[1]#扣除金额
shop_count+=p_item[1]#累加购物金额
print("添加 \033[32;1m%s\033[0m 到购物车,价格: \033[32;1m%s\033[0m 元"% p_item)
print("你的购物金额余 \033[31;1m%s\033[0m 元"% name_char)
else:
print("你的购物金额余 \033[41;1m%s\033[0m 元,无法购买该商品!" % name_char)
else:
print('输入错误,该编号 \033[41;1m%s\033[0m 的商品不存在!'%user_index)
elif user_index=='q'or user_index=='Q':
print('你的购物清单:')
for up in shoplist:#打印购物清单
print(up)
print("你的购物总金额为:\033[32;1m%s\033[0m 元!"% shop_count)
print("你的购物金额余: \033[31;1m%s\033[0m 元!" % name_char)
while True:
confirm=input("你是否确定退出购物?\033[31;1m Y/y \033[0m 是 \033[31;1mN/n\033[0m 否:")
if confirm== 'Y'or confirm== 'y' :
infor_list[_user_name]['金额']=name_char#修改用户金额(购物后)
shoplist.append(('总额:',shop_count))#列表加入总额
history_list[_user_name][times+'购物清单:']=shoplist#添加时间:清单
with open('user_infor','w',encoding="utf-8") as user_infor:#写入文件用户信息
user_infor.seek(0)#移到最前
user_infor.write(str(user_list))#写入
with open('history','r+',encoding='utf-8') as user_history:#购物信息写入文件
user_history.seek(0)#移到最前
user_history.write(str(history_list))#写入
exit(print("谢谢!欢迎您再次光临!"))
elif confirm=='N'or confirm== 'n' :
break
else:
print("输入错误!请按提示输入!")
continue
else:
print('\033[41;1m输入商品编号错误,请重新输入!\033[0m')

还着一点点,撸了一天的代码了!!还想要更好!!

完美 主义,伤不起来!!

python第七天-作业[购物车]的更多相关文章

  1. 2003031121——浦娟——Python数据分析第七周作业——MySQL的安装及使用

    项目 要求 课程班级博客链接 20级数据班(本) 作业要求链接 Python第七周作业 博客名称 2003031121--浦娟--Python数据分析第七周作业--MySQL的安装及使用 要求 每道题 ...

  2. C语言学习 第七次作业总结

    C语言学习 第七次作业总结 数组可以分为数组和多下标数组(在传统的国内C语言书本中,将其称为二/多维数组). 数组名称 在之前的课程中,大家应该都有印象,对于int a这样的定义,会为变量 a 声明一 ...

  3. 耿丹CS16-2班第七次作业汇总

    Deadline: 2016-11-27 11:59pm 作业内容 第七次作业总结 01.每次成绩发布,麻烦没交作业的同学(暂定得分为-5的),请及时补交: 02.想不出来可以,代码乱成一团不行,命名 ...

  4. 简学Python第七章__class面向对象高级用法与反射

    Python第七章__class面向对象高级用法与反射 欢迎加入Linux_Python学习群  群号:478616847 目录: Python中关于oop的常用术语 类的特殊方法 元类 反射 一.P ...

  5. python实现简单的循环购物车小功能

    python实现简单的循环购物车小功能 # -*- coding: utf-8 -*- __author__ = 'hujianli' shopping = [ ("iphone6s&quo ...

  6. 初学Python(七)——控制语句

    初学Python(七)——控制语句 初学Python,主要整理一些学习到的知识点,这次是控制语句. if : #-*- coding:utf-8 -*- age=raw_input('input yo ...

  7. 网络1711班 C语言第七次作业批改总结

    网络1711班 C语言第七次作业批改总结 1.本次作业评分细则 1.1 基本要求(1分) 按时交 - 有分 未交 - 0分 迟交一周以上 - 倒扣本次作业分数 抄袭 - 0分 泛泛而谈(最多七分) 1 ...

  8. 2017-2018-1 我爱学Java 第六七周 作业

    团队六七周作业 完善版需求规格说明书 制定团队编码规范 数据库设计 后端架构设计 TODOList 参考资料 完善版需求规格说明书 <需求规格说明书>初稿不足之处: 1.开发工具写错 2. ...

  9. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

随机推荐

  1. SVN服务器搭建实录

    第一章  SVN介绍 1.1 什么是SVN(subversion) SVN是近年来崛起的非常优秀的版本管理工具,与CVS管理工具一样,SVN是一个固态的跨平台的开源的版本控制系统.SVN版本管理工具管 ...

  2. 4 spring 创建对象的三种方式

    方式1. 通过构造方法创建     1.1 无参构造创建:默认情况.     1.2 有参构造创建:需要明确配置         1.2.1 需要在类中提供有参构造方法         1.2.2 在 ...

  3. Java工程师学习指南 入门篇

    Java工程师学习指南 入门篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...

  4. sql语句出错:Column count doesn't match value count at row 1

    报错内容: java.sql.SQLException: Column count doesn't match value count at row 1 at com.mysql.jdbc.SQLEr ...

  5. jq通过对象获取其ID值

    $(this).click(function(){ var this_id=$(this).attr("id");// attr(属性名) 获取属性的值 alert(this_id ...

  6. jqGrid 翻页

    比如查出来有9条数据,表格第一页显示5条,第二页显示4条 第一次查询,后台返回9条数据,但是只显示第一页的5条, 当点击下一页,会再去数据库查询,只返回第二页的4条数据, 这时候再点击回到上一页,返回 ...

  7. JSP+Servlet+mysql简单示例【图文教程】

    下载MYSQL:http://dev.mysql.com/downloads/ 下载安装版的 然后安装(安装步骤就不详细说了) 安装好之后,点击托盘图标,打开管理工具 创建一个数据库   数据库的名字 ...

  8. mybatis教程6(逆向工程)

    什么是逆向工程 简单点说,就是通过数据库中的单表,自动生成java代码. Mybatis官方提供了逆向工程,可以针对单表自动生成mybatis代码(mapper.java\mapper.xml\po类 ...

  9. Linux进程间通信(System V) --- 信号量

    信号量 IPC 原理 信号量通信机制主要用来实现进程间同步,避免并发访问共享资源.信号量可以标识系统可用资源的个数.最简单的信号量为二元信号量 下图为 Linux 信号量通信机制的概念图.在实际应用中 ...

  10. opoa介绍

    一 定义      One Page, One Application(后面缩写为OPOA,或者1P1A), 含义很简单:一个页面就是一个应用.不再使用iframe, 页面提交不能再使用submit方 ...