Python学习之购物车
实现功能:
- 程序启动,提示用户输入用户名和密码,程序读取余额文件last_salary.txt内容(文件不存在则自动创建),若文件内容为空则提示“首次登录,请输入工资”;
- 用户可以输入商品编号进行购买;
- 用户选择商品后,自动计算总价,若总价超过账户余额salary,则提示余额不足;若总价未超过余额,则自动扣除;
- 用户可在购买过程中随时退出“q”;
- 关键信息高亮显示;
- 用户退出时,余额信息存入文件last_salary.txt,购买商品信息存入文件last_bucket.txt,文件不存在则自动创建;
- 用户再次登录时,读取并显示当前账户余额信息;
- 用户可在购买过程中输入“h”查询历史消费信息;
- 支持多个用户;
- 支持显示当前购物车商品数量;
- 当购物车为空,退出时显示提示信息。
示例代码:
# -*- 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学习之购物车的更多相关文章
- Python学习--------------Atm+购物车系统
一.程序需求 模拟实现一个ATM + 购物商城程序: 1.额度 15000或自定义 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.每月22号出账单,每月10号 ...
- python学习:购物车程序
购物车程序 product_list = [ ('mac',9000), ('kindle',800), ('tesla',900000), ('python book',105), ('bike', ...
- python 学习分享-购物车实操篇
程序要求如下: '''购物车程序: 启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就 ...
- Python学习笔记(十三)
Python学习笔记(十三): 模块 包 if name == main 软件目录结构规范 作业-ATM+购物商城程序 1. 模块 1. 模块导入方法 import 语句 import module1 ...
- Python学习计划
---恢复内容开始--- Python学习计划 https://edu.csdn.net/topic/python2?utm_source=blog4 匠人之心,成就真正Python全栈工程师 ...
- Python学习第五堂课
Python学习第五堂课推荐电影:华尔街之狼 被拯救的姜哥 阿甘正传 辛德勒的名单 肖申克的救赎 上帝之城 焦土之城 绝美之城 #上节内容: 变量 if else 注释 # ""& ...
- python学习笔记目录
人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...
- Python学习day5作业
目录 Python学习day5作业 ATM和购物商城 1. 程序说明 2. 基本流程图 3. 程序测试帐号 4. 程序结构: 5. 程序测试 title: Python学习day5作业 tags: p ...
- Python学习系列(四)Python 入门语法规则2
Python学习系列(四)Python 入门语法规则2 2017-4-3 09:18:04 编码和解码 Unicode.gbk,utf8之间的关系 2.对于py2.7, 如果utf8>gbk, ...
随机推荐
- Java方法-对指定信息基于相关维度进行分组
近期项目中需要针对多种不同来源指定的相同类型内容进行合并,实现过程中需要根据指定的相关维度,对资源内容进行分组,如识别是否可以为同一人员信息,是否为同一个歌曲或影视信息,因此针对实现的具体细节做如下备 ...
- MVC4笔记 @functions @model @using
/////@functions自定义函数////// @helper辅助方法的确可以很方便的完成辅助方法开发,不过却失去了一些弹性,例如,无法在@helper中自定义属性,只能单纯的传入参数,然后格式 ...
- [转]c#匿名类
首先让我们看一个例子, 假设我们并没有Person类, 并且我们关心的属性只有Name和Age. 下面的代码演示了我们如何在没有声明类型的情况下来构建一个对象的: 1: var tom = new { ...
- JAVA避免入坑必备
1.关于@Override Annocation 对于子类(包括并且特别是匿名类)中,重写父类的函数,一定要加上@Override.这会帮助你避免很多不必要的看起来让人恼怒的错误.比如,为什么子类重写 ...
- Android Studio修改默认Activity继承AppCompatActivity(转)
在Android Studio中新建Activity默认继承AppCompatActivity,感觉这点十分不爽,找了很久,终于发现在Android Studio安装目录下有个模板文件,修改其中的参数 ...
- 详解HTML中的表单元素
代码详讲: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...
- Dynamics CRM 2011通过客户端代码选择视图
在实施的过程中我们经常会遇到这样的场景,有个系统标准的Lookup字段对应的不是一种Entity,如很多地方的客户实际上可选account或者contact,有的地方可选systemuser或者tea ...
- [COM Interop学习小结]实现一个C#调用C++的示例
最近在研究产品的架构代码,发现其中涉及到Com组件技术,即项目中的C# Project会通过Com接口来调用C++ Project中的方法,研究一下,实现一个小的例子,供自己学习. 一. 什么是COM ...
- u-boot分析(二)----工作流程分析
u-boot分析(二) 由于这两天家里有点事,所以耽误了点时间,没有按时更新,今天我首先要跟大家说说我对于u-boot分析的整体的思路,然后呢我以后的博客会按照这个内容更新,希望大家关注. 言归正传, ...
- php中增删改查以及返回结果(一)
虽然毕业后找的第一份正式的工作并不那么令人满意,但是在度过最初的迷茫期后,自己还是决定成为一个程序猿. 最近也是利用上班偶尔闲下来的时间,开始看书,撸代码,写一些小程序. 这两个礼拜主要的写的都是有关 ...