当前位置: 首页 > 编程日记 > 正文

Python 基础 - Day 2 Assignment - ShoppingCart 购物车程序

作业要求

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

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

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

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

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

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

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

知识点解析

  • 函数式编程的逻辑和过程: 将项目的要求步骤化,并赋予不同的函数名。主程序调用这些函数。
def init():                             # 系统初始化(读取所有商品并保存为全局变量)return Truedef login():                            # 登录认证passdef register():                         # 新用户注册,第一次登录,输入salarypassdef show_products():                    # 展示所有商品的序号/名称/单价passdef user_choice():                      # 让用户输入选择的商品序号或者'q', 'q'返回就调用shwo_current_shopping_logpassdef show_current_shopping_log():        # 显示本次购物日志passdef balance_enough():                   # 检验余额是否足够passdef add_cart():                         # 放入购物车,高亮显示,扣费。并调用日志信息shopping_log()和 show_user_balance()passdef shopping_log():                     # 添加到本次消费日志和用户信息的日志中passdef save_user():                        # 将用户信息存入文件中去passdef show_user_balance():                # 显示当前用户的历史购物日志passdef show_shopping_log():                # 显示用户所有历史的消费记录pass
View Code
  • 函数的返回值 return True: 用来检验函数执行是否成功
  • 函数嵌套函数:常用于装饰器。我们知道,函数内定义的变量是局部变量。但是,如果函数内有函数,函数参数值在函数内的有效的。
  • 尽量详细的拆分
  • 调用文件全路径的方法: - OS 模块见笔记: http://www.cnblogs.com/lg100lg100/p/7158222.html
import osBASE_DIR = os.path.dirname(__file__)
DB_DIR = os.path.join(BASE_DIR,'db') 
# print(BASE_DIR)
# print(DB_DIR)

os.path.exist()
  • JSON 模块见笔记: http://www.cnblogs.com/lg100lg100/p/7160951.html
  • 作业中出现的错误:字段名的命名还是用英语比较好,中文出现错别字,就无法执行程序。

作业代码:

#!usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Jane Yueimport sys
import jsonopen_line = '''有机生鲜 多*快*好*省
----------------------------------
a键: 新用户注册
b键:登陆账户
q键:退出
----------------------------------
'''user_menu = ['退出', '购物', '充值', '查询']def save_into_file(db_dict, filename='user_data.json'):# 辅助函数:将信息存入文件,默认文件为 user_status.jsonwith open(filename, "w", encoding="utf-8") as f:json.dump(db_dict, f)def load_from_file(filename='user_data.json'):# 辅助函数:读取文件信息,默认文件为 user_status.jsonwith open(filename, 'r', encoding="utf-8") as f:db_dict = json.load(f)return db_dictdef openline():# 程序开始while True:print(open_line)open_choice = input('请根据菜单选择:').strip()if open_choice == "a":username = input("用户名:")register(username)elif open_choice == "b":login()elif open_choice == "q":sys.exit()else:print("错误信息,重新输入")continuedef login():# 登录认证db_dict = load_from_file()                  # python字典格式:{"username":{"密码": "password","历史记录":["商品"], "余额": 000}}count = 0while count < 3:username = input('用户名: ')if username in db_dict:password = input('密码: ')if password == db_dict[username]["密码"]:print("小主,欢迎回来买买买!")core_menu(username)else:count += 1print("密码错误,您还有%d机会。" % (3 - count))continueelse:print("用户名不存在,请注册新账户")register(username)return Truedef register(username):# 注册新账户并存入文件db_dict = load_from_file()while True:print("用户名:%s" % username)password = input("密码:")if len(password.strip()) > 0:db_dict[username] = {"密码": "password","历史纪录": ["商品"],"余额": 000}ini_balance = int(input("首次充值额:"))db_dict[username]["余额"] = ini_balancesave_into_file(db_dict)print("欢迎第一次登陆,%s" % username)core_menu(username)else:print("请输入密码")continuedef core_menu(username):# 用户登陆后,显示选项及菜单print('用户菜单'.center(25, "="))for i in user_menu:print(user_menu.index(i), i)while True:choice = input('亲,请选择 >>> ')if choice == "1":shopping(username)elif choice == "2":topup(username)elif choice == "3":show_user_balance(username)elif choice == "q":print('88,亲')sys.exit()else:print('错误信息,请重新选择')continuedef shopping(username):# 购物menu_dict = load_from_file("menu.json")db_dict = load_from_file()while True:for i in sorted(menu_dict):print(i)option1 = input('请选择\033[001m产品分类\033[0m 【b】返回 【任意键】退出').strip()            # 001加粗if option1 in menu_dict:print('{}清单如下:'.format(option1).rjust(25, '-'))for k in menu_dict[option1]:print(k, menu_dict[option1][k])while True:option2 = input('请选择 \033[001m商品\033[0m 加入购物车【b】返回 【q键】退出 ').strip()if option2 in menu_dict[option1]:option3_num = input('请输入购买数量').strip()if option3_num.isdigit() and int(option3_num) <= menu_dict[option1][option2]['数量']:num = int(option3_num)price = menu_dict[option1][option2]['单价']cost = num*pricebalance = db_dict[username]['余额']if cost<=balance:db_dict[username]['余额'] -= costdb_dict[username]['历史记录'].append(option2)                  # 添加字典value值数据???
                            save_into_file(db_dict)menu_dict[option1][option2]['数量'] -= numsave_into_file(menu_dict, "menu.json")print("商品已购,您的最新余额为\033[34m%d\033[0m" % (db_dict[username]['余额']))breakelse:print('账户余额不足,请充值')core_menu(username)else:print("抱歉,商品数目不足")continueelif option2 == 'b':breakelif option2 == 'q':sys.exit()else:print('错误信息,请重新选择')continueelif option1 == 'b':core_menu(username)else:sys.exit()def topup(username):# 充值db_dict = load_from_file()top_up = input('请填写充值金额')if top_up.isdigit():db_dict[username]["余额"] += int(top_up)save_into_file(db_dict)show_user_balance(username)else:print('错误信息,请重新选择')core_menu(username)def show_user_balance(username):# 显示用户余额db_dict = load_from_file()print('{},您的当前余额为\033[34m{}\033[0m'.format(username,db_dict[username]['余额']))show_shopping_log(username)def show_shopping_log(username):# 显示用户所有历史的消费记录db_dict = load_from_file()shopping_log = db_dict[username]['历史记录']if shopping_log == '':print("您在本小店没有消费记录")core_menu(username)else:print('历史消费如下:',shopping_log)choice = input('【b键】返回主菜单 【q键】退出')if choice == 'q':sys.exit()else:core_menu(username)if __name__ == '__main__':openline()
View Code

转载于:https://www.cnblogs.com/lg100lg100/p/7123722.html

相关文章:

hdu 1878 欧拉回路

欧拉回路 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10548 Accepted Submission(s): 3849 Problem Description欧拉回路是指不令笔离开纸面&#xff0c;可画过图中每条边仅一次&#xff0c;且可以回到起点…

bootstrap 时间日期日历控件(datetimepicker)附效果图

开发交流QQ群: 173683895 173683895 526474645 人满的请加其它群 效果图 代码 <!DOCTYPE html> <html><head><meta charset"UTF-8"><link href"https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel&q…

如何在您HTML中嵌入视频和音频

by Abhishek Jakhar通过阿比舍克贾卡(Abhishek Jakhar) 如何在您HTML中嵌入视频和音频 (How to embed video and audio in your HTML) HTML allows us to create standards-based video and audio players that don’t require the use of any plugins. Adding video and audi…

html 省份,城市 选择器附效果图

开发交流QQ群: 173683895 173683895 526474645 人满的请加其它群 效果图&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><link href"https://cdn.bootcss.com/bootstrap/3.3.7/css/boots…

机器学习:协方差矩阵

一、统计学的基本概念 统计学里最基本的概念就是样本的均值、方差、标准差。首先&#xff0c;我们给定一个含有n个样本的集合&#xff0c;下面给出这些概念的公式描述&#xff1a; 均值&#xff1a; 标准差&#xff1a; 方差&#xff1a; 均值描述的是样本集合的中间点&#xf…

TemplatedParent 与 TemplateBinding

http://blog.csdn.net/idebian/article/details/8761388转载于:https://www.cnblogs.com/changbaishan/p/4716414.html

避免成为垃圾邮件_如何避免犯垃圾

避免成为垃圾邮件by Yoel Zeldes由Yoel Zeldes 如何避免犯垃圾 (How to avoid committing junk) In the development process, every developer writes stuff they don’t intend to commit and push to the remote server, things like debug prints. It happens to all of u…

[bzoj2333] [SCOI2011]棘手的操作 (可并堆)

//以后为了凑字数还是把题面搬上来吧2333 发布时间果然各种应景。。。 Time Limit: 10 Sec Memory Limit: 128 MB Description 有N个节点&#xff0c;标号从1到N&#xff0c;这N个节点一开始相互不连通。第i个节点的初始权值为a[i]&#xff0c;接下来有如下一些操作&#xff1…

vue.js created函数注意事项

因为created钩子函数是页面一加载完就会调用的函数&#xff0c;所以如果你想在这个组件拿值或者是赋值&#xff0c;很可能this里面能拿到数据&#xff0c;但是如果你用this.赋值的话&#xff0c;控制台或者debugger都会发现this里面有你所想要的数据&#xff0c;但是赋值后就是…

JS删除城市的后缀

开发交流QQ群: 173683895 173683895 526474645 人满的请加其它群 代码 const deleteStr str >{if (str.indexOf("市") ! -1 || str.indexOf("州") ! -1){str str.substring(0, str.length - 1)console.log(删除城市的最后一个字,str)return s…

gatsby_将您的GraphCMS数据导入Gatsby

gatsbyLets set up Gatsby to pull data from GraphCMS.让我们设置Gatsby来从GraphCMS中提取数据。 This will be a walk-through of setting up some basic data on the headless CMS, GraphCMS and then querying that data in Gatsby.这将是在无头CMS&#xff0c;GraphCMS上…

Java学习笔记07--日期操作类

一、Date类 在java.util包中定义了Date类&#xff0c;Date类本身使用非常简单&#xff0c;直接输出其实例化对象即可。 public class T { public static void main(String[] args) { Date date new Date(); System.out.println("当前日期&#xff1a;"date); //当前…

javascript数组集锦

设计数组的函数方法 toString, toLocaleString, valueOf, concat, splice, slice indexOf,lastIndexOf, push, pop, shift, unshift, sort, reverse map, reduce, reduceRight, filter, every, some, forEach 创建数组 数组字面量创建&#xff1a;var arr [val1, val2, val3];…

JS实现HTML标签转义及反转义

开发交流QQ群: 173683895 173683895 526474645 人满的请加其它群 编码反编码 function html_encode(str) { var s ""; if (str.length 0) return ""; s str.replace(/&/g, "&amp;"); s s.replace(/</g, "<")…

喜欢把代码写一行的人_我最喜欢的代码行

喜欢把代码写一行的人Every developer has their favourite patterns, functions or bits of code. This is mine and I use it every day.每个开发人员都有自己喜欢的模式&#xff0c;功能或代码位。 这是我的&#xff0c;我每天都用。 它是什么&#xff1f; (What is it?) …

智能家居APP开发

智能家居APP开发 APP开发技术qq交流群&#xff1a;347072638 前言&#xff0c;随着智能硬件设备的流行&#xff0c;智能家居開始红火&#xff0c;智能家居就是家用电器的智能化。包含智能锁&#xff0c;灯&#xff0c;空调&#xff0c;灯&#xff0c;音箱等等&#xff0c;移动设…

android小技巧(二)

一、如何控制Android LED等&#xff1f;(设置NotificationManager的一些参数) 代码如下: final int ID_LED19871103; NotificationManager nm(NotificationManager)getSystemService(NOTIFICATION_SERVICE); Notification notification new Notification(); notificatio…

JS 验证表单不能为空

开发交流QQ群: 173683895 173683895 526474645 人满的请加其它群 JS 验证表单不能为空的简单demo&#xff0c;先看效果图 实现代码 <!--index.wxml--> <form classform bindsubmitformSubmit bindresetformReset><input namename value{{name}} placeho…

周末不用过来了,好好休息吧_如何好好休息

周末不用过来了&#xff0c;好好休息吧When I wrote about my productive routine in a previous article, I said I’d work for 1.5 hours and take a break for 30 minutes. And I’d repeat this sequence four times a day.当我在上一篇文章中谈到生产性例程时&#xff0c…

HTML实现折现图完整源码及效果图

开发交流QQ群: 173683895 173683895 526474645 人满的请加其它群 效果图 源码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><script src"https://cdnjs.cloudflare.com/ajax/libs/echarts/4.2.1/echarts-en.common…

Date类(java.util)和SimpleDateFormat类(java.text)

在程序开发中&#xff0c;经常需要处理日期和时间的相关数据&#xff0c;此时我们可以使用 java.util 包中的 Date 类。这个类最主要的作用就是获取当前时间&#xff0c;我们来看下 Date 类的使用&#xff1a; 使用 Date 类的默认无参构造方法创建出的对象就代表当前时间&#…

8月12笔记-安卓文件扫描

Android的文件系统 1.Android的项目是运行在Linux操作系统上的 2.Linux的文件系统根目录是/&#xff0c;Windows只有某个盘符根目录 3.mnt文件夹是手机的内存卡根目录&#xff0c;此目录是安卓开发经常使用的 4.在windows下&#xff0c;最高管理员叫做Administrator&#xff0c…

可视化编码_Modulz简介:可视编码的下一步

可视化编码by Colm Tuite通过Colm Tuite Modulz简介&#xff1a;可视编码的下一步 (Introducing Modulz: The Next Step in Visual Coding) Modulz is a visual code editor for designing and building digital products — without writing code. Last week, we launched ou…

SQL执行过程中的性能负载点

一、SQL执行过程 1、用户连接数据库&#xff0c;执行SQL语句&#xff1b; 2、先在内存进行内存读&#xff0c;找到了所需数据就直接交给用户工作空间&#xff1b; 3、内存读失败&#xff0c;也就说在内存中没找到支持SQL所需数据&#xff0c;就进行物理读&#xff0c;也就是到磁…

认识Backbone (五)

Backbone.Router&#xff08;路由&#xff09;/ Backbone.history&#xff08;历史&#xff09; Backbone.Router 为客户端路由提供了许多方法&#xff0c;并能连接到指定的动作&#xff08;actions&#xff09;和事件&#xff08;events&#xff09;。 对于不支持 History API…

if else 你以为你把它吃透了吗?我让你惊讶一下

开发交流QQ群: 173683895 173683895 526474645 人满的请加其它群 if 和 else 是写代码最常用的&#xff0c;但是往往同学们不会去深入的了解他&#xff0c;这里我写几个Demo玩玩。 首先简单列一下什么值会返回true &#xff0c; 什么值会返回false。 示例&#xff1a;…

router路由react_使用React Router在React中受保护的路由

router路由reactIn this video, you will see how to create a protected route using React Router. This route is accessible only when the user is logged in.在此视频中&#xff0c;您将看到如何使用React Router创建受保护的路由。 仅当用户登录时&#xff0c;此路由才可…

SSH框架搭建笔记

1、建立一个web项目&#xff0c;设置编码格式&#xff0c;建立src下的包&#xff0c;建立资源文件夹 2、加入Spring运行必须的jar包(5个jar包)spring-beans-4.1.4.RELEASE.jarspring-context-4.1.4.RELEASE.jarspring-core-4.1.4.RELEASE.jarspring-expression-4.1.4.RELEASE.j…

灵活运用 SQL SERVER FOR XML PATH

FOR XML PATH 有的人可能知道有的人可能不知道&#xff0c;其实它就是将查询结果集以XML形式展现&#xff0c;有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作。那么以一个实例为主. 一.FOR XML PATH 简单介绍 那么还是首先来介绍一下FOR…

小程序画布,随机24个数显示在画布上面,不可重叠

QQ技术交流群 173683866 526474645 欢迎加入交流讨论&#xff0c;打广告的一律飞机票 效果图&#xff08;下面两个图都是随机显示24的圆圈在画布上面&#xff09; 实现代码 <!--pages/test2/test2.wxml--> <canvas style"width: 100%; height:700rpx;" ca…