一.作业需求:

1、启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表

2、允许用户根据商品编号购买商品

3、用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒

4、可随时退出,退出时,打印已购买商品和余额

5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示

6、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买

7、允许查询之前的消费记录

二.购物车用户信息:

{'name': {'password': '10000'}, 'cx': {'123': '725.0'}, 'even': {'qw': '1560'}, 'cv1': {'1': 100.5}}
以字典形式存储用户名,密码,余额

三.历史购物信息:

{'name': [['iphone', 5800], ['bike', 800]], 'cx': [['iphone', 5800], ['apple', 5],  ['apple', 5], ['book', 75]]}
以字典形式,对应用户名和历史购物记录

四.流程图:

五.代码:(python3.6,mac环境):

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Even set = False # 设置set 当输入为q就可以退出
file = open('购物车用户信息存档','r+',encoding='utf-8') # 读取购物车用户信息文件
f = str(file.read()) # 将文件内容转化成字符串
for line in f: # 逐行读取
file_str = str(f)
data= eval(file_str) # 将字符串转换为字典data
name = input("请输入姓名:") # 提示输入用户名
password = input("请输入密码:") # 提示输入密码
while True:
if name in data: # 用户名在字典data
if password in data[name]: # 密码如果能对应用户名,就欢迎登录
salay = float(data[name][password])
print('''\033[32;1m欢迎登录,当前余额为%s\033[0m'''%salay)
break
else: # 否则密码输入错误,提示重新输入
password = input("密码输入错误,请重新输入:")
continue
else: # 否则判断为首次登录,将用户名,密码,工资存到用户信息文件中
password_salay = {}
salay_str = input("欢迎首次登录,请输入你的工资:") # 输入工资数
salay = float(salay_str) # 将输入的字符串转换为数字
password_salay[password] = salay # 将工资对应到密码
data[name] = password_salay # 将密码-工资对对应到用户名
file.seek(0) # 文件的读取移到开头
file.write(str(data)) # 写入新的字典信息
file.tell() # 返回当前位置
break list = [ # 购物清单
["iphone",5800],
["bike",800],
["macbook",17500],
["book",75],
["apple",5]
] file_list_r = open('历史购买记录','r+',encoding='utf-8') # 读取历史购买记录文件
f_list_r = str(file_list_r.read())
shoppinglist_dict = eval(f_list_r) # 将历史记录信息转换为字典
if name not in shoppinglist_dict: # 如果首次登录,会没有历史记录
shoppinglist_dict[name] = [] # 首次登录历史记录留空
shoppinglist = shoppinglist_dict[name] # 不是首次登录,将之前历史记录赋值到变量
shoppinglist_now = [] # 本次购物记录留空
choose = input("\n是否需要查询历史购物记录(y/n):") # 询问是否需要查询历史记录
if choose == 'y': # 选y,输出历史购物记录
print("\n\n-----------历史购物记录------------")
print(shoppinglist)
print("--------------结束---------------\n\n") while not set: # 购物车开始
print('-----------商品清单------------') # 输出商品清单
for index,item in enumerate(list,1):
print(index,item)
print("-------------结束--------------")
number = input("请输入想购买的商品编号:") # 输入商品编号
if number == "q": # 当输入为q,退出,打印本次购物清单
set = True
data[name][password] = str(salay) # 将字符串的工资给到对应用户名下的密码-工资对中
file.seek(0)
file.write(str(data)) # 将用户信息写入购物车用户信息存档中
file.tell()
print("------------购物清单------------") # 打印购物清单,提示余额
print(shoppinglist_now)
print("您的余额为:",salay)
print("-------------结束--------------")
shoppinglist.extend(shoppinglist_now) # 将本次购物记录追加到购物记录列表中
shoppinglist_dict[name] = shoppinglist # 购物列表与用户名做对应
file_list_r.seek(0)
file_list_r.write(str(shoppinglist_dict)) # 写入字符串的购物历史记录
file_list_r.tell()
elif number.isdigit() == False: # 校验输入是否为整数
print("\033[31;1m输入不是编号内容,请重新输入\033[0m")
elif int(number)>int(len(list)) or int(number)<= 0: # 如果输入值不在清单中,提示报错
print("\033[31;1m您所购买的商品不在清单中\033[0m")
else:
number_buy = int(number)-1
if list[number_buy][1]<(salay): # 如果余额够,提示成功购买,显示余额
salay = salay - int(list[number_buy][1])
msg = '''
\033[32;1m您已将%s加入购物车中
余额为%d\033[0m
''' % (list[number_buy][0],salay)
print(msg)
shoppinglist_now.append(list[number_buy]) # 本次购物信息加到本次购买记录中
else:
print("\033[31;1m您已没有余额可以购买\033[0m") # 否则提示余额不足

python作业:购物车(第二周)的更多相关文章

  1. python学习笔记第二周

    目录 一.基础概念 1.模块 1)os模块 2)sys模块 2.pyc文件 3.数据类型 1)数字 2)布尔值 3)字符串 4.数据运算 5.运算符 6.赋值运算 7.逻辑运算 8.成员运算 9.身份 ...

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

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

  3. 【吴恩达课后编程作业】第二周作业 - Logistic回归-识别猫的图片

    1.问题描述 有209张图片作为训练集,50张图片作为测试集,图片中有的是猫的图片,有的不是.每张图片的像素大小为64*64 吴恩达并没有把原始的图片提供给我们 而是把这两个图片集转换成两个.h5文件 ...

  4. python刷题第二周

    1: 第3章-5 字符转换 (15 分) 本题要求提取一个字符串中的所有数字字符('0'--'9'),将其转换为一个整数输出. 输入格式: 输入在一行中给出一个不超过80个字符且以回车结束的字符串. ...

  5. python作业ATM(第五周)

    作业需求: 额度 15000或自定义. 实现购物商城,买东西加入 购物车,调用信用卡接口结账. 可以提现,手续费5%. 支持多账户登录. 支持账户间转账. 记录每月日常消费流水. 提供还款接口. AT ...

  6. Python学习之旅--第二周--元组、字符串、运算、字典

    一.元组 另一种有序列表叫元组:tuple.tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字: # Author:Tim Gu tuple = (" ...

  7. python课程第二周重点记录

    python课程第二周重点记录 1.元组的元素不可被修改,元组的元素的元素可以被修改(字典在元组中,字典的值可以被修改) 2.个人感觉方便做加密解密 3.一些方法的使用 sb = "name ...

  8. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

  9. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

  10. 2017-2018-1 Java演绎法 第二周 作业

    团队任务:讨论Android上的游戏软件 参考现代软件工程 第一章 [概论]练习与讨论: 软件有很多种,也有各种分类办法,本次团队任务是讨论选取Android上的一个游戏软件,考虑到每位组员接触的游戏 ...

随机推荐

  1. VPS一键测试脚本 / 自带结果导出

    脚本命令 一下脚本可能卡住,运行时间长,建议在screen中运行. 1.秋水逸冰大佬的Bench.sh脚本 特点:用时较短,对系统测试全面,英文:但缺少国内节点测速 有趣的是,bench.sh既是脚本 ...

  2. 2018.7.3 JS实现增删改查没有连接数据库

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  3. 如何安装Ruby(Windows)

    Ruby解释器的安装 1.Windows平台 想尽快安装并运行Ruby,可遵循如下步骤: 1.启动Web浏览器,访问 http://www.ruby-lang.org/en/downloads/ 2. ...

  4. HttpServerUtility 和 HttpUyility

    参考:msdn HttpServerUtility 提供用于处理 Web 请求的 Helper 方法. 2017/08/07            加密解码 这个类没有构造函数,所以不能直接new. ...

  5. System.Web.UI.Page

    mdsn:点击查看此类介绍 git:   点击查看封装方法   消息弹框,消息弹框跳转,自定义脚本信息 定义:表示一个从托管 ASP.NET Web 应用程序的服务器请求的 .aspx 文件(也称为 ...

  6. 4.Spring Cloud初相识--------Feign负载均衡

    前言: 在上一节里,我们学习了ribbon的使用. 我们了解到ribbon是一个客户端负载均衡机制. 而我们今天要讲的Feign呢,也是一款客户端负载均衡机制. 或者这样说,Feign封装了ribbo ...

  7. java基础必备单词讲解 day two

    variable 变量 count 统计 sum 总数 salary 薪水 Scanner 接收 import 导入 eclipse 日食 control 控制 shift 改变 alt 替换键 ha ...

  8. 如何将一个div水平垂直居中

    方案一: div绝对定位水平垂直居中[margin:auto实现绝对定位元素的居中], 兼容性:,IE7及之前版本不支持 div{ width: 200px; height: 200px; backg ...

  9. vue学习之路 - 0.背景

    1 单页面应用程序 Single Page Application (SPA) 从字面意义来看就是一个网站就一个页面,如: coding 网易云音乐 极致的用户体验,就像nativeapp一样 优点: ...

  10. Make a Person-freecodecamp算法题目

    Make a Person 1.要求 用下面给定的方法构造一个对象:方法有 getFirstName(), getLastName(), getFullName(), setFirstName(fir ...