实现功能:

  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. C#操作Excel报错:服务器出现意外情况。

    C#操作Excel表格时,如遇以下错误: 服务器出现意外情况.(异常来自 HRESULT:0x80010105(RPC_E_SERVERFAULT)) 解决方案: 打开你电脑中的Office-Exce ...

  2. node Error: Could not locate the bindings file. Tried:解决

    问题描述: Error: Could not locate the bindings file. Tried: → C:\code\xxx\node_modules\deasync\build\dea ...

  3. 使用dtd--属性声明

    <!ATTLIST 元素名 属性名称 属性类型 属性特点> 1.属性类型 类型 含义 CDATA 纯文本 enumerated 枚举类型 ID 以属性的方式唯一标识改元素,必须以字母开头 ...

  4. ToDictionary写法

    把List集合转化成Dictionary public ActionResult Dimo() { Dictionary<string, Object> param = new Dicti ...

  5. kafka存储机制以及offset

    1.前言 一个商业化消息队列的性能好坏,其文件存储机制设计是衡量一个消息队列服务技术水平和最关键指标之一.下面将从Kafka文件存储机制和物理结构角度,分析Kafka是如何实现高效文件存储,及实际应用 ...

  6. Cocos2D-HTML5 Android项目编译

    首先要有 Eclipse 和 ADT.CDT.Android SDK.Android NDK.新建一个文件MoonWar_Apk.cmd,将以下代码拷贝其中,双击之即可. set EngineHome ...

  7. 缺陷=bug?

    Defect(缺陷):是指静态处在于软件工作产品(文档.代码)中的错误,也指软件运行时由于这些错误被激发导致的软件产品与其属性的偏离现象. Bug:Bug通常是软件缺陷(Defect)导致的一些软件故 ...

  8. Spark资源管理

    Spark资源管理 1.介绍 Spark资源管控分为spark集群自身可支配资源配置和job所用资源配置. 2.spark集群支配资源控制 在spark的conf/spark-env.sh文件中可以指 ...

  9. MATLAB/OCTAVE常用命令 cheat sheet

    MATLAB cheatsheet http://web.mit.edu/18.06/www/Spring09/matlab-cheatsheet.pdf 清除变量 clear 清屏 clc //cl ...

  10. MAC读取希捷移动硬盘ntfs

    希捷提供了mac读取ntfs磁盘的软件,Paragon. 搜索关键词 "希捷" "mac" 或者通过以下链接进入 https://www.seagate.com ...