作业之购物车优化

购物车优化要求如下:

用户入口:

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

商家入口:

可以添加商品

具体代码如下:

import os, time#导入os和time模块
if not os.path.exists('d:\\consumer_login.txt'):#判断用户登录的文件是否存在
with open('d:\\users\\consumer_login.txt','w') as f_cons:#创建文件
f_cons.write('''{'zhangsan':'123','wangwu':'a324','lisi':'li123'}''')#写入数据
f_cons.close()#关闭文件
def login():#声明一个登录的函数
'''该函数主要用于用户登录,错误三次的用户被锁定,且不能再登录,用户名和密码存在文件中,登录成功将打印欢迎语句。'''
with open('d:\\users\\consumer_login.txt') as f_cons,\
open('d:\\users\\locked_users.txt','a+') as f_lock:#打开两个文件
name_list = []#声明一个列表用于记录输入错误用户名的次数
consumers = eval(f_cons.read())#把文件内的数据读取到内存
f_lock.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
lock_list = [i.strip() for i in f_lock.readlines()]#使用列表推导式把文件内的每行信息作为新列表的每个元素
for i in lock_list:#遍历列表
print('用户(\033[31m%s\033[0m)被锁定!'% i)
while True:
login_user = input('请输入用户名:').strip()
if login_user in lock_list:#判断输入的用户是否已经存在于锁定文件当中
print('用户(\033[31m%s\033[0m)已被锁定!'% login_user)
break
else:
login_pwd = input('请输入密码:').strip()
if (login_user,login_pwd) in consumers.items():#判断输入信息作为元祖的两个元素是否存在于字典的键值对中
print('欢迎来到购物商城!')
f_cons.close()
f_lock.close()
return login_user
else:
print('用户或者密码错误,请重新输入!')
name_list.append(login_user)#把输入错误的用户名添加到列表中
if name_list.count(login_user) == 3:#判断列表中本次输入的用户名是否出现三次
f_lock.write(login_user+'\n')#把错误的用户名写入到文件中
print('用户(\033[31m%s\033[0m)已被锁定!'% login_user)
break
continue
login_user = login()#赋值调用函数
def first_login():#声明一个函数,判断用户是否是第一次登陆
'''该函数用户判断用户是否是第一次登陆,如果是第一次登陆将输入金额并把金额存储到文件中,最终返回选择购物的函数'''
with open('d:\\users\\users_list.txt','a+') as users_l,\
open('d:\\users\\%s_record.txt'% login_user,'a+') as record:
users_l.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
users_name = [i.strip() for i in list(users_l.readlines())]#利用列表推导式变量文件内容并赋值给列表
if login_user in users_name:
print('欢迎您再次光临购物商城!')
record.close()
users_l.close()
return user_choice()#返回另一个函数
else:
users_l.write(login_user +'\n')
print('欢迎您第一次登录购物商城!')
while True:
moneys = input('输入工资后才能开始购物,请输入您的金额:').strip()
if moneys.isdigit():
moneys = int(moneys)
print('您当前的金额为:\033[31m%s\033[0m元人民币!'% moneys)
record.write('用户名为\033[34m%s\033[0m的账号,第一次充值的金额为\033[31m%s\033[0m元人民\
币!\t日期:\033[34m%s\033[0m\n'%(login_user,moneys,time.strftime('%Y-%m-%d %H:%M:%S')))
#上行代码中人民币中间有一个换号符
f = open('d:\\users\\%s_money.txt' % login_user,'a+')#创建一个用于存储用户金额的文件
f.write(str(moneys)+'\n')
f.close()
users_l.close()
record.close()
return user_choice()
else:
print('输入的工资格式有误,请重新输入!')
continue
if not os.path.exists('d:\\users\\goods.txt'):
with open('d:\\users\\goods.txt','w') as f_goods:
f_goods.write('''{'book':13,'pig':300,'bike':'990','pen':5,'iphone':3000,'ipad':1800,}''')
f_goods.close()
def user_choice():#声明一个函数
'''该函数主要用于用户选择购物和查询记录'''
with open('d:\\users\\%s_record.txt'% login_user,'a+') as record,\
open('d:\\users\\%s_money.txt' % login_user,'a+')as f_money,\
open('d:\\users\\goods.txt') as f_goods:
while True:
print('温馨提示:\nA.按a或者A选择购物!\nB.按b或者B选择查询记录!\nC.按q或者Q退出程序!')
choose = input('请输入您的选择:').strip()
if choose == 'a' or choose == 'A':
good_dic = eval(f_goods.read())#把商品转换为内存里面的字典
while True:
for index,i in enumerate(good_dic,1):
print(index,'.\033[34m%s\033[0m \033[31m%s\033[0m'%(i,good_dic[i]))
print('温馨提示:\n1.选择商品编号进行购买\n2.选择Q或者q退出商城')
choice = input('请选择您要购买的商品编号:').strip()
if choice.isdigit():
if int(choice) < len(good_dic.keys()):
gooded = list(good_dic.keys())[int(choice)-1]#获取编号对应的商品名称
f_money.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
moneys = int([i.strip() for i in list(f_money.readlines())][-1])#获取文件中的金额
if moneys >= int(good_dic[gooded]):
moneys -= int(good_dic[gooded])
record.write('您本次购买了价格为\033[31m%s\033[0m元的\033[34m%s\033[0m商品!当\
前总余额为\033[31m%s\033[0m元!'%(good_dic[gooded],gooded,moneys))
record.write('\t日期:\033[34m%s\033[0m\n'% time.strftime('%Y-%m-%d %H:%M:%S'))
f_money.write(str(moneys)+'\n')
print('购买成功!')
continue
else:
print('余额不足!')
continue
else:
print('out range!')
continue
elif choice == 'q' or choice == 'Q':
break
else:
print('Error!')
continue
elif choose == 'b' or choose == 'B':
record.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
print(record.read())
continue
elif choose == 'q' or choose == 'Q':
print('程序已退出!')
break
else:
print('输入的格式有误!')
continue
first_login()

注:该代码实现的功能是:用户登录,错误三次将锁定用户,正确则需要判断是否是第一次登陆,第一次登陆需要输入金额和创建金额文件,然后选择购物或者查看购物记录,下次登陆则不需要输入金额,接着上次余额进行继续使用。

购物车优化:

import os, time#导入os和time模块
if not os.path.exists('d:\\consumer_login.txt'):#判断用户登录的文件是否存在
with open('d:\\users\\consumer_login.txt','w') as f_cons:#创建文件
f_cons.write('''{'zhangsan':'123','wangwu':'a324','lisi':'li123'}''')#写入数据
f_cons.close()#关闭文件
def login():#声明一个登录的函数
'''该函数主要用于用户登录,错误三次的用户被锁定,且不能再登录,用户名和密码存在文件中,登录成功将打印欢迎语句。'''
with open('d:\\users\\consumer_login.txt') as f_cons,\
open('d:\\users\\locked_users.txt','a+') as f_lock:#打开两个文件
name_list = []#声明一个列表用于记录输入错误用户名的次数
consumers = eval(f_cons.read())#把文件内的数据读取到内存
f_lock.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
lock_list = [i.strip() for i in f_lock.readlines()]#使用列表推导式把文件内的每行信息作为新列表的每个元素
for i in lock_list:#遍历列表
print('用户(\033[31m%s\033[0m)被锁定!'% i)
while True:
login_user = input('请输入用户名:').strip()
if login_user in lock_list:#判断输入的用户是否已经存在于锁定文件当中
print('用户(\033[31m%s\033[0m)已被锁定!'% login_user)
break
else:
login_pwd = input('请输入密码:').strip()
if (login_user,login_pwd) in consumers.items():#判断输入信息作为元祖的两个元素是否存在于字典的键值对中
print('欢迎来到购物商城!')
f_cons.close()
f_lock.close()
return login_user
else:
print('用户或者密码错误,请重新输入!')
name_list.append(login_user)#把输入错误的用户名添加到列表中
if name_list.count(login_user) == 3:#判断列表中本次输入的用户名是否出现三次
f_lock.write(login_user+'\n')#把错误的用户名写入到文件中
print('用户(\033[31m%s\033[0m)已被锁定!'% login_user)
break
continue
login_user = login()#赋值调用函数
def first_login():#声明一个函数,判断用户是否是第一次登陆
'''该函数用户判断用户是否是第一次登陆,如果是第一次登陆将输入金额并把金额存储到文件中,最终返回选择购物的函数'''
with open('d:\\users\\users_list.txt','a+') as users_l,\
open('d:\\users\\%s_record.txt'% login_user,'a+') as record:
users_l.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
users_name = [i.strip() for i in list(users_l.readlines())]#利用列表推导式变量文件内容并赋值给列表
if login_user in users_name:
print('欢迎您再次光临购物商城!')
record.close()
users_l.close()
return user_choice()#返回另一个函数
else:
users_l.write(login_user +'\n')
print('欢迎您第一次登录购物商城!')
while True:
moneys = input('输入工资后才能开始购物,请输入您的金额:').strip()
if moneys.isdigit():
moneys = int(moneys)
print('您当前的金额为:\033[31m%s\033[0m元人民币!'% moneys)
record.write('用户名为\033[34m%s\033[0m的账号,第一次充值的金额为\033[31m%s\033[0m元人民\
币!\t日期:\033[34m%s\033[0m\n'%(login_user,moneys,time.strftime('%Y-%m-%d %H:%M:%S')))
#上行代码中人民币中间有一个换号符
f = open('d:\\users\\%s_money.txt' % login_user,'a+')#创建一个用于存储用户金额的文件
f.write(str(moneys)+'\n')
f.close()
users_l.close()
record.close()
return user_choice()
else:
print('输入的工资格式有误,请重新输入!')
continue
if not os.path.exists('d:\\users\\goods.txt'):
with open('d:\\users\\goods.txt','w') as f_goods:
f_goods.write('''{'book':13,'pig':300,'bike':'990','pen':5,'iphone':3000,'ipad':1800,}''')
f_goods.close()
def user_choice():#声明一个函数
'''该函数主要用于用户选择购物和查询记录'''
shopping_car = []
with open('d:\\users\\%s_record.txt'% login_user,'a+') as record,\
open('d:\\users\\%s_money.txt' % login_user,'a+')as f_money:
while True:
print('温馨提示:\nA.按a或者A选择购物!\nB.按b或者B选择查询记录!\nC.按q或者Q退出程序!')
choose = input('请输入您的选择:').strip()
if choose == 'a' or choose == 'A':
f_goods = open('d:\\users\\goods.txt')
good_dic = eval(f_goods.read())#把商品转换为内存里面的字典
f_goods.close()
while True:
for index,i in enumerate(good_dic,1):
print(index,'.\033[34m%s\033[0m \033[31m%s\033[0m'%(i,good_dic[i]))
print('温馨提示:\n1.选择商品编号进行购买\n2.选择Q或者q退出商城')
choice = input('请选择您要购买的商品编号:').strip()
if choice.isdigit():
if int(choice) <= len(good_dic.keys()):
gooded = list(good_dic.keys())[int(choice)-1]#获取编号对应的商品名称
f_money.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
moneys = int([i.strip() for i in list(f_money.readlines())][-1])#获取文件中的金额
if moneys >= int(good_dic[gooded]):
moneys -= int(good_dic[gooded])
buy = '您本次购买了价格为\033[31m%s\033[0m元的\033[34m%s\033[0m商品!当前总余\
额为\033[31m%s\033[0m元!'%(good_dic[gooded],gooded,moneys)
shopping_car.append(buy)
record.write(buy)
record.write('\t日期:\033[34m%s\033[0m\n'% time.strftime('%Y-%m-%d %H:%M:%S'))
f_money.write(str(moneys)+'\n')
print('购买成功!商品\033[34m%s\033[0m已加入到购物车,您的余额为\033[31m%s\033[0m\
元!' % (gooded,moneys))
continue
else:
print('余额不足!')
continue
else:
print('out range!')
continue
elif choice == 'q' or choice == 'Q':
break
else:
print('Error!')
continue
elif choose == 'b' or choose == 'B':
record.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
print(record.read())
continue
elif choose == 'q' or choose == 'Q':
if len(shopping_car) < 1:
print('您本次并未购买商品!')
else:
for i in shopping_car:
print(i)
print('程序已退出!')
break
else:
print('输入的格式有误!')
continue
first_login()

注:主要优化点为:

  1. 购买成功时打印已购买商品和余额
  2. 退出时打印本次购买的商品和余额
  3. 优化购买商品与选择查询记录两个循环不能多次切换
  4. 声明:对于文件路径可以使用不指定路径,但上述代码未方便多次调试,加了指定路径

Python之作业购物车的更多相关文章

  1. python之作业--------购物车优化

    Read Me:继上次简单购物车的实现,有再一次的升级优化了下,现实现以下几个功能: 1.有客户操作和商家操作,实现,客户可以买东西,当金额不足提醒,最后按q退出,打印购物车列表 2.商家可以添加操作 ...

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

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

  3. python第七天-作业[购物车]

    作业要示: 购物车程序:启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表允许用户根据商品编号购买商品用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出 ...

  4. Python培训12期-day2作业-购物车

    #!/usr/bin/env python import sys import os import getpass 商品={ '图书': { "<Puppet实战>": ...

  5. python作业购物车(第二周)

    一.作业需求: 1.启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 4 ...

  6. python基础day2作业:购物车

    #功能:1.可注册账号2.登录买家账号3.可查询编辑购物车里商品4.可以余额充值5.可提示余额不足6.购物车结算 #使用:1.第一次使用先注册账号填写账号金额2.账号金额信息保存在buyer_acco ...

  7. [作业] Python入门基础---购物车小程序

    1.购物车小程序: 1.1用户输入工资取60% 1.2打印输出商品菜单 1.3由用户输入数字选择 #__author:Mifen #date: 2018/11/27 # 购物车程序 #把工资作为账户的 ...

  8. Python学习--------------Atm+购物车系统

    一.程序需求 模拟实现一个ATM + 购物商城程序: 1.额度 15000或自定义 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.每月22号出账单,每月10号 ...

  9. python之编写购物车(第二天)

    作业: 编写购物车 具体实现了如下功能: 1.可购买的商品信息显示 2.显示购物车内的商品信息.数量.总金额 3.购物车内的商品数量进行增加.减少和商品的删除 4.用户余额的充值 5.用户购买完成进行 ...

随机推荐

  1. day-5 python协程与I/O编程深入浅出

    基于python编程语言环境,重新学习了一遍操作系统IO编程基本知识,同时也学习了什么是协程,通过实际编程,了解进程+协程的优势. 一.python协程编程实现 1.  什么是协程(以下内容来自维基百 ...

  2. GIT入门笔记(20)- 使用eclipse 基于 git 开发过程梳理

    一.创建本地分支 1.下载/更新 本地 主干 如果本地还没有 本地主干,下载:git clone 如果本地已有了 本地主干,更新:git pull 工程右键菜单:team -> pull 2.基 ...

  3. api-gateway实践(08)新服务网关 - 云端发布和日志查看

    一.发布应用 1.新建应用空间 1.1.新建应用空间 1.2.新建应用 1.3.上传程序包 2.创建应用引擎服务 3.发布应用 3.1.为应用容器绑定Web运行环境(应用引擎服务) 3.2.发布应用( ...

  4. 云计算(2)it 是什么

    2015年,全世界在it上面的花费达到3亿8千亿美金之多. 云数据中心:核心基础架构,云计算的物理载体,提供数据处理.存储和高性能计算支撑,包括服务器.存储.冷却.机房空间和能耗管理等. 超大规模的云 ...

  5. Spring Security 入门(1-1)Spring Security是什么?

    1.Spring Security是什么? Spring Security 是一个安全框架,前身是 Acegi Security , 能够为 Spring企业应用系统提供声明式的安全访问控制. Spr ...

  6. JSON的简单书写(初学),使用Java语言反序列化

    这个适合初学者:刚刚我学习的 1.基础的"JSON"     对象是用一对大括号: 例如: {      "name":"xiaohua", ...

  7. SpringBoot2.x开发案例之整合Quartz任务管理系统

    基于spring-boot 2.x + quartz 的CRUD任务管理系统,适用于中小项目. 基于spring-boot +quartz 的CRUD任务管理系统: https://gitee.com ...

  8. hdu-1237 简单计算器---中缀表达式转后缀表达式

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 思路 ...

  9. 编写CGI程序步骤

    CGI common gateway interface 可以让一个客户端,从网页浏览器向服务器请求数据, 这是描述客户端和服务器程序之间传输数据的一种标准. CGI是运行在服务器上的程序,提供同客户 ...

  10. Java集合总结【面试题+脑图】,将知识点一网打尽!

    前言 声明,本文用的是jdk1.8 花了一个星期,把Java容器核心的知识过了一遍,感觉集合已经无所畏惧了!!(哈哈哈....),现在来总结一下吧~~ 回顾目录: Collection总览 List集 ...