一.作业需求:

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. kiiti分割的数据及其处理

    kitti和cityscape的gt的分割不太一样,下边缘不再是从黑色开始的,而是直接是类别 red,green,blue = img_gt[i,j] 1.道路的颜色(紫色):128 64 128 2 ...

  2. (python)剑指Offer:数组中重复的数字

    问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...

  3. ImportError: No module named images

    [问题] 在使用学习wxPython时,一个Dem抱有如题所示错误 [解决] images 只不过是wxpython自带demo中的一个文件 体验wxpython IN action的时候Import ...

  4. Linux下内存的几个基本概念

    先介绍几个基本概念: SIZE: 进程使用的地址空间, 如果进程映射了100M的内存, 进程的地址空间将报告为100M内存. 事实上, 这个大小不是一个程序实际使用的内存数. RSS: "R ...

  5. mysql默认字符集问题

    最近在使用mysql的时候出现了奇怪的乱码问题,最开始发现mysql的字符集的确存在一些问题. 经过修改配置文件/etc/my.cnf [mysqld] character-set-server=ut ...

  6. Spring Bean依赖但注入(autowired或resource)时NullPointerException(xml和annotation混用的场景下)

    项目中同时使用了xml和annotation的方式管理Spring Bean 启动时候报NullPointerException,依赖注入失败! 参考: http://fly0wing.iteye.c ...

  7. typeid操作符

    typeid() operator返回type_info,返回值不可拷贝.不可赋值 // Illustrates the typeid operator. #include <iostream& ...

  8. vim 个性化设置和操作

    一.vim 设置 1. 设置行号显示 1) 临时显示 命令行模式 :set nu 2) 永久显示 # vim ~/.vimrc 插入一行代码: set number 若没有该文件,在用户主目录 (/h ...

  9. java实现 zip解压缩

    程序实现了ZIP压缩.共分为2部分 : 压缩(compression)与解压(decompression) 大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压. ...

  10. Windows下如何安装composer

    相对 来说并不难直接将此文件下载安装即可 1 https://getcomposer.org/Composer-Setup.exe 文件地址由官方提供 https://getcomposer.org/ ...