实现功能:

  1. 程序启动,提示用户输入用户名和密码,程序读取余额文件last_salary.txt内容(文件不存在则自动创建),若文件内容为空则提示“首次登录,请输入工资”;
  2. 用户可以输入商品编号进行购买;
  3. 用户选择商品后,自动计算总价,若总价超过账户余额salary,则提示余额不足;若总价未超过余额,则自动扣除;
  4. 用户可在购买过程中随时退出“q”;
  5. 关键信息高亮显示;
  6. 用户退出时,余额信息存入文件last_salary.txt,购买商品信息存入文件last_bucket.txt,文件不存在则自动创建;
  7. 用户再次登录时,读取并显示当前账户余额信息;
  8. 用户可在购买过程中输入“h”查询历史消费信息;
  9. 支持多个用户;
  10. 支持显示当前购物车商品数量;
  11. 当购物车为空,退出时显示提示信息。

示例代码:

 # -*- coding: utf-8 -*-

 import os
from datetime import datetime goods = [
{"name": "电脑", "price": 1999},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 20},
{"name": "美女", "price": 998},
] now = datetime.now().strftime('%Y-%m-%d %H:%M:%S') #获取当前时间
bucket = [] #定义空列表存储购买的商品
price_list = {} #将商品及其价格以“键值对”形式存入字典
total_price = item_price = 0
exit_flag = False
user_info = {'admin':'admin','alex':''} #定义用户名密码 #生成商品-价格字典
for i in goods:
a = list(i.values())
price_list.setdefault(a[0],a[1]) #生成商品名称列表
product_list = list(price_list) #开始
while not exit_flag:
username = input("用户名:").strip()
if username in user_info:
while not exit_flag:
userpasswd = input("密码:").strip()
if userpasswd == user_info.get(username):
if not os.path.isfile(username + '_last_salary.txt'): #判断username + '_last_salary.txt'是否存在,不存在则创建,存在则读取文件内容
with open(username + '_last_salary.txt', 'w+', encoding='utf-8') as f:
s = f.read()
else:
with open(username + '_last_salary.txt','r',encoding= 'utf-8') as f: #若username + '_last_salary.txt'文件存在,则读取内容
s = f.read()
if len(s): #如果username + '_last_salary.txt'不存在或为空,则表示用户首次登录,要求输入工资
salary = int(s)
print("\033[1;31;m*欢迎回来!账户余额:%d\033[0m " % salary)
else:
while True:
salary = input("\033[1;31;m*首次登录,请输入工资:\033[0m").strip() #首次登陆需输入工资
if salary.isdigit():
salary = int(salary)
break
else:
print("输入错误,请重试!")
print("-------商品列表------")
for n,i in enumerate(price_list):
print(n,i,price_list[i])
while not exit_flag: #要求用户输入商品编号
select = input("请选择商品:").strip()
if select.isdigit() and int(select) < len(goods): #判断输入的商品编号是否是数字,且在范围内
select = int(select)
p = product_list[select]
item_price = price_list[p]
total_price += item_price
if salary < item_price: #若余额小于所选商品价格,则提示余额不足
print("\033[1;31;m余额不足!\033[0m")
print(salary)
else: #若余额大于或等于所选商品价格,则扣除相应该商品对应价格并加入购物车
salary = salary - item_price
bucket.append(p)
print("\033[1;31;m \'%s\'已加入购物车! \033[0m" % p )
elif select == 'q': #若用户输入q退出,则:打印已购买商品列表;打印账户余额;将余额和购买记录分别存入不同文件
print("\033[1;31;m-------已购买商品-------\033[0m")
if len(bucket):
for n,p in enumerate(set(bucket)):
print(p,tuple(bucket).count(p))
else:
print("当前购物车为空!")
print("\033[1;31;m-----------------------\033[0m")
print("\033[1;31;m账户余额:%d\033[0m" % salary)
with open(username + '_last_salary.txt','w',encoding= 'utf-8') as f1:
f1.write(str(salary)) #将余额存入文件username + '_last_salary.txt'
with open(username + '_last_bucket.txt','a+',encoding= 'utf-8') as f2:
for i in bucket: #将消费记录存入文件username + '_last_bucket.txt',若文件不存在则创建,指定写入字符串编码为utf-8
f2.write(now + ' ' + i + '\n')
exit_flag = True
elif select == 'h': #当用户输入'h',读取并打印历史消费信息
print("--------历史购买商品-------")
if os.path.isfile(username + '_last_bucket.txt'):
with open(username + '_last_bucket.txt','r',encoding= 'utf-8') as f:
l = f.read()
print(l)
else:
with open(username + '_last_bucket.txt', 'w', encoding='utf-8') as f:
print("历史记录为空!")
else:
print("请输入商品编号!")
continue
else:
print("密码错误,请重试!")
else: print("用户不存在,请重试!")

代码写的有点冗余繁杂,后期再优化。

Python学习之购物车的更多相关文章

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

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

  2. python学习:购物车程序

    购物车程序 product_list = [ ('mac',9000), ('kindle',800), ('tesla',900000), ('python book',105), ('bike', ...

  3. python 学习分享-购物车实操篇

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

  4. Python学习笔记(十三)

    Python学习笔记(十三): 模块 包 if name == main 软件目录结构规范 作业-ATM+购物商城程序 1. 模块 1. 模块导入方法 import 语句 import module1 ...

  5. Python学习计划

    ---恢复内容开始--- Python学习计划   https://edu.csdn.net/topic/python2?utm_source=blog4   匠人之心,成就真正Python全栈工程师 ...

  6. Python学习第五堂课

    Python学习第五堂课推荐电影:华尔街之狼 被拯救的姜哥 阿甘正传 辛德勒的名单 肖申克的救赎 上帝之城 焦土之城 绝美之城 #上节内容: 变量 if else 注释 # ""& ...

  7. python学习笔记目录

    人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...

  8. Python学习day5作业

    目录 Python学习day5作业 ATM和购物商城 1. 程序说明 2. 基本流程图 3. 程序测试帐号 4. 程序结构: 5. 程序测试 title: Python学习day5作业 tags: p ...

  9. Python学习系列(四)Python 入门语法规则2

    Python学习系列(四)Python 入门语法规则2 2017-4-3 09:18:04 编码和解码 Unicode.gbk,utf8之间的关系 2.对于py2.7, 如果utf8>gbk, ...

随机推荐

  1. pat1040. Longest Symmetric String (25)

    1040. Longest Symmetric String (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, ...

  2. HDU 4336——Card Collector——————【概率dp】

    Card Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. java学习第十三天

    1:StringBuffer(掌握) (1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了 一个字符串缓冲区类.StringBuffer供我们使 ...

  4. Day4上午

    expect100+50+50, In fact 100+10+0. 代码能力还有待提高,部分分应该能拿的.结果...力不从心啊. T1 贪心做的不知对不对. 看来思路是对的,不知道能不能对. 暴力做 ...

  5. Unity C# 用枚举(enum)制作复选框

    最近在项目中做测试脚本用到一些布尔值做方法的开关,突然想到可以制作一个复选框控制开关. 首先搜集网上的资料,基本大同小异,这里就不多做解释了,代码附上: public class EnumFlagsA ...

  6. c#-day03学习笔记

    循环语句 一共有三种 1: For循环 2: while 循环 3: do while 循环 //1             //2             //4 For循环  语法       f ...

  7. 特殊的流程控制语句break continue exit

    break语句可以结束当前的for.foreach.while.do-while.或者switch的执行. for($i=1; $i<10; $i++) { if($i == 5) { echo ...

  8. h5:erver-Sent Events

    对于一般的 Web 应用开发,大多数开发人员并不陌生.在 Web 应用中,浏览器和服务器之间使用的是请求 / 响应的交互模式.浏览器发出请求,服务器根据收到的请求来生成相应的响应.浏览器再对收到的响应 ...

  9. three.js学习笔记--基础知识

    基础知识 从去年开始就在计划中的three.js终于开始了 历史介绍 (摘自ijunfan1994的转载,感谢作者) OpenGL大概许多人都有所耳闻,它是最常用的跨平台图形库. WebGL是基于Op ...

  10. Android 使用xml实现边框阴影,背景渐变效果(附有RGB颜色查询对照表)

    上图是显示效果,下面是代码实现: 个人理解就是使用layer-list实现两层view的叠加,其中top,left,bottom,left控制阴影 <?xml version="1.0 ...