发现之前的三级菜单代码有BUG现已经修改过来了

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

对于昨天的作业自己不太满意!所以重新设计了流程图:

增加新的功能:

1,可以注册!

2,可以查看当前购物的清单

3,可以不结算退出

详细代码如下:

 #!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
import time,sys,os
user_file=open("user_file.txt",'r+',encoding='utf-8')#打开用户列表文件
#with open('user_file.txt','r+',encoding='utf-8') as user_file:
user_list=eval(user_file.readline())#转换用户文件中的字符串 user_list:注册用户列表
lock_name=open('lock_name.txt','r+',encoding='utf-8')#打开锁定用户列表文件
lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串 def regis():
while True:
name=input("请输入您要注册的用户名:")
if name not in user_list:
print("恭喜!该用户名可以被注册!>>>")
password=input('请输入密码:')
password2=input('请再次确认密码:')
if password==password2:
name_infor='''恭喜您用户注册成功!
用户名:{name}
密 码:{password}
请牢记您的用户名与密码
'''
print(name_infor.format(name=name,password=password2))
user_list[name]=password2#增加注册用户到字典中
user_file.seek(0)#称到最前
user_file.write(str(user_list))#写入文件
user_file.flush()#即可保存 #confirm()
break
else:
print("该用户名已经被注册啦!请重新来过<<<")
confirm()#是否退出
continue def userchar(_user_name):#检测用户名的函数
while True:
if _user_name in user_list and _user_name not in lock_list:#判断用户是否存在并正常
return True#存在返回真
elif _user_name in user_list and _user_name in lock_list:#判断用户是否被锁定
print('您的用户已经被锁定,请联系商家解锁!')
break
else:
reg=input('您输入用户不存在,请先注册!按\033[31;1m Q/q\033[0m 直接退出 \033[31;1m Y/y\033[0m 确定注册,其它键返回!')
if reg=='y' or reg=='Y':
regis()#用户注册函数
print('是否直接退出商城?')
break
elif reg=='q' or reg=='Q':
print("您已经退出!" )
exit()
else :
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:
print("用户登陆".center(30,'-'))
_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 def history_user():#用户购物历史记录函数
with open('history','r',encoding="utf-8") as user_history:#读取用户文件
history_list=eval(user_history.readline())#用户购物信息
return history_list def history():#用户消费记录函数
history_list=history_user()#用户购物历史记录
history=history_list[_user_name]#用户购物记录信息
print('您的购物记录如下:')
for k,v in history.items():#转为列表进行输出
print(k,v)#输出购物记录
choose_index=input("请选择您想要的操作:按\033[32;1mq/Q\033[0m直接退出商城!其它键返回!")
if choose_index=='Q' or choose_index=='q' :
choo=input('''>>>>>\033[42;1m您确定出退商城吗?\033[0m
如果您已经添加商品,此操作将不进行结算,
您就无法将心爱的东东买回家了,按\033[31;1my/Y\033[0m确定直接退出!''')
if choo=='y'or choo=='Y':
print("您已经出退商城!")
exit()
else:
pass
#程序开始:
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))#写入用户信息
print("充值成功,充值金额:\033[32;1m%s\033[0m元."% name_char)
break
else:
print('金额不能为0或负数请正确输入金额!')
continue #再次登陆直接显示用户信息
infor_list=infor()#使用用户信息函数 获取用户信息字典
name_char=int(infor_list[_user_name]['金额'])#获取余额
print("\n您的帐户信息:")
print('用户名:\033[32;1m%s\033[0m:'%_user_name)#输出用户信息
print('您的余额:\033[31;1m%s\033[0m元.:'%name_char)
while True:
print('''您可以进行以下相关操作:\n
按 1 >>>查询购物记录。
按 2 >>>显示商品列表开始购物!
按 3 >>>直接出退商城!
''')
choose=input("请选择您所要的功能:")#请用户可以查询
if choose=='':
history()#查询消费记录
elif choose=='':
###进入商品列表###
shoplist=[]#购物车列表
shop_count=0#购物金额统计
goodsname=[]#定义商品列表
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:
print("商品列表".center(50,'='))
for index,p_item in enumerate(goodsname):#取出下标输出 商品列表
print(index,p_item)#输出商品列表
print("列表底部".center(50,'='))
user_index=input('请输入商品编号添加你所在购买的商品,按\033[31;1mc/C\033[0m>> 查看当前购物清单, \033[31;1mh/H\033[0m查看消费记录 \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=history_user()#用户消费记录函数
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(infor_list))#写入
with open('history','r+',encoding='utf-8') as user_history:#购物信息写入文件
user_history.seek(0)#移到最前
user_history.write(str(history_list))#写入
exit(print("谢谢!\033[31;1mpython\033[0m 商城欢迎您再次光临!"))
elif confirm=='N'or confirm== 'n' :
break
else:
print("输入错误!请按提示输入!")
continue
elif user_index=='h'or user_index=='H':
history()#查消费记录
elif user_index=='c'or user_index=='C':
print("当前购物清单:")
for up in shoplist:#打印购物清单
print(up)
print("总金额:\033[32;1m%s\033[0m"%shop_count)
continue
else:
print('\033[41;1m输入商品编号错误,请重新输入!\033[0m') elif choose=='':
print("您已经出退商城!")
exit()#退出商城
else:
print("\033[31;1m输入有误,请重新输入!\033[0m")
continue

花了两天,感觉还是值得的!!哈哈!

python第八天)——购物车作业优化完成的更多相关文章

  1. python(4)- 简单练习:python实现购物车的优化

    购物车程序优化题目要求: 1. 用户退出时打印商品列表时,按以下格式 -------您购买的商品如下------ id    商品    数量    单价    总价 1      iPhone 2  ...

  2. 1.3if判断语句+while和for循环语句+购物车作业

    1.if 语句 if userame=_usename and password=_password: print("welcome user {name} login..."). ...

  3. Python编程规范及性能优化(转载)

    转载地址:http://codeweblog.com/python编程规范及性能优化/

  4. python练习_购物车(简版)

    python练习_购物车(简版) 需求: 写一个python购物车可以输入用户初始化金额 可以打印商品,且用户输入编号,即可购买商品 购物时计算用户余额,是否可以购买物品 退出结算时打印购物小票 以下 ...

  5. Python第八天 模块 包 全局变量和内置变量__name__ Python path

    Python第八天  模块   包   全局变量和内置变量__name__    Python path 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Pyt ...

  6. Spark集群之yarn提交作业优化案例

    Spark集群之yarn提交作业优化案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.启动Hadoop集群 1>.自定义批量管理脚本 [yinzhengjie@s101 ...

  7. 孤荷凌寒自学python第八天 初识Python的序列之元组

    孤荷凌寒自学python第八天 Python的序列之元组 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) (同步音频笔记:https://www.ximalaya.com/keji/19103 ...

  8. python单例模式的实现与优化

    python单例模式的实现与优化 阅读目录(Content) 单例模式 实现单例模式的几种方式 1.使用模块 2.使用装饰器 3.使用类 4.基于__new__方法实现(推荐使用,方便) 5.基于me ...

  9. 2003031121-浦娟-python数据分析五一假期作业

    项目 内容 课程班级博客链接 20级数据班(本) 这个作业要求链接 Python作业 博客名称 2003031121-浦娟-python数据分析五一假期作业 要求 每道题要有题目,代码(使用插入代码, ...

随机推荐

  1. [EXP]Joomla! Component Easy Shop 1.2.3 - Local File Inclusion

    # Exploit Title: Joomla! Component Easy Shop - Local File Inclusion # Dork: N/A # Date: -- # Exploit ...

  2. odoo开发笔记 -- 后台日志输出及分析

    odoo开发笔记 -- 后台日志输出及分析 附:日志分析软件

  3. Hadoop生态系统之Yarn

    Apache YARN(Yet Another Resource Negotiator) 是Hadoop的集群资源管理系统.YARN被引入Hadoop2最初是为了改善MapReduce的实现,但它具有 ...

  4. asp.net core的docker实践

    如果centos中没有安装和docker和.net core镜像,先安装docker和asp.net core 镜像 安装dockeryum -y install docker-io 启动 Docke ...

  5. Zabbix4.2.0基本配置和邮件报警

    目录 1. 修改中文 2. 添加监控本机 3. 监控本机mysql 4. 配置邮件报警 4.1 添加FTP模板 4.2 报警媒介类型 4.3 配置报警到用户 4.4 配置动作 4.5 模拟FTP故障 ...

  6. (转)创建GitHub技术博客

    https://blog.csdn.net/renfufei/article/details/37725057

  7. git第十节--git hub

    github 是一个开源的协作社区 github 插件octtree 为别人的仓库做贡献 fork 别人仓库内容到自己的个人仓库 git clone 到本地进行开发push 到个人仓库 提PR(pul ...

  8. JavaWeb学习 (二十)————JavaWeb的两种开发模式

    一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示

  9. vmware--查看链接克隆依赖关系

    我们都知道,虚拟机克隆有完全克隆和链接克隆两种克隆方式.当根据模版去链接克隆出很多机器时,时间一长或者把克隆后的机器改名了,我们就忘记了哪台机器是克隆出来的,哪台是直接装的.如果不小心把模版机器给删除 ...

  10. python中逻辑运算符“+”的特殊之处

    num = num + num 与 num += num 的区别(其他语言中这两种方式可以划等号,但是python中不可以): num = num + num: num = [100] def tes ...