taoyx.log co"> Python 基础 - Day 2 Assignment - ShoppingCart 购物车程序 - 11GX
首页 > Python 基础 - Day 2 Assignment - ShoppingCart 购物车程序

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('请选择33[001m产品分类33[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('请选择 33[001m商品33[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("商品已购,您的最新余额为33[34m%d33[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('{},您的当前余额为33[34m{}33[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

更多相关:

  • #coding:utf-8'''Created on 2017年10月25日@author: li.liu'''import pymysqldb=pymysql.connect('localhost','root','root','test',charset='utf8')m=db.cursor()'''try:#a=raw_inpu...

  • python数据类型:int、string、float、boolean 可变变量:list 不可变变量:string、元组tuple 1.list list就是列表、array、数组 列表根据下标(0123)取值,下标也叫索引、角标、编号 new_stus =['刘德华','刘嘉玲','孙俪','范冰冰'] 最前面一个元素下标是0,最...

  • from pathlib import Path srcPath = Path(‘../src/‘) [x for x in srcPath.iterdir() if srcPath.is_dir()] 列出指定目录及子目录下的所有文件 from pathlib import Path srcPath = Path(‘../tenso...

  • 我在使用OpenResty编写lua代码时,需要使用到lua的正则表达式,其中pattern是这样的, --热水器设置时间 local s = '12:33' local pattern = "(20|21|22|23|[01][0-9]):([0-5][0-9])" local matched = string.match(s, "...

  • 在分析ats的访问日志时,我经常会遇到将一些特殊字段对齐显示的需求,网上调研了一下,发现使用column -t就可以轻松搞定,比如 找到ATS的access.log中的200响应时间过长的日志 cat access.log | grep ' 200 ' | awk -F '"' '{print $3}' > taoyx.log co...