作业要求
1、启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表
2、允许用户根据商品编号购买商品
3、用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
4、可随时退出,退出时,打印已购买商品和余额
5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示
6、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买
7、允许查询之前的消费记录
知识点解析
- 函数式编程的逻辑和过程: 将项目的要求步骤化,并赋予不同的函数名。主程序调用这些函数。
def init(): # 系统初始化(读取所有商品并保存为全局变量) return True def login(): # 登录认证 pass def register(): # 新用户注册,第一次登录,输入salary pass def show_products(): # 展示所有商品的序号/名称/单价 pass def user_choice(): # 让用户输入选择的商品序号或者'q', 'q'返回就调用shwo_current_shopping_log pass def show_current_shopping_log(): # 显示本次购物日志 pass def balance_enough(): # 检验余额是否足够 pass def add_cart(): # 放入购物车,高亮显示,扣费。并调用日志信息shopping_log()和 show_user_balance() pass def shopping_log(): # 添加到本次消费日志和用户信息的日志中 pass def save_user(): # 将用户信息存入文件中去 pass def show_user_balance(): # 显示当前用户的历史购物日志 pass def show_shopping_log(): # 显示用户所有历史的消费记录 pass
- 函数的返回值 return True: 用来检验函数执行是否成功
- 函数嵌套函数:常用于装饰器。我们知道,函数内定义的变量是局部变量。但是,如果函数内有函数,函数参数值在函数内的有效的。
- 尽量详细的拆分
- 调用文件全路径的方法: - OS 模块见笔记: http://www.cnblogs.com/lg100lg100/p/7158222.html
import os BASE_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 Yue import sys import json open_line = ''' 有机生鲜 多*快*好*省 ---------------------------------- a键: 新用户注册 b键:登陆账户 q键:退出 ---------------------------------- ''' user_menu = ['退出', '购物', '充值', '查询'] def save_into_file(db_dict, filename='user_data.json'): # 辅助函数:将信息存入文件,默认文件为 user_status.json with open(filename, "w", encoding="utf-8") as f: json.dump(db_dict, f) def load_from_file(filename='user_data.json'): # 辅助函数:读取文件信息,默认文件为 user_status.json with open(filename, 'r', encoding="utf-8") as f: db_dict = json.load(f) return db_dict def 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("错误信息,重新输入") continue def login(): # 登录认证 db_dict = load_from_file() # python字典格式:{"username":{"密码": "password","历史记录":["商品"], "余额": 000}} count = 0 while count < 3: username = input('用户名: ') if username in db_dict: password = input('密码: ') if password == db_dict[username]["密码"]: print("小主,欢迎回来买买买!") core_menu(username) else: count += 1 print("密码错误,您还有%d机会。" % (3 - count)) continue else: print("用户名不存在,请注册新账户") register(username) return True def 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_balance save_into_file(db_dict) print("欢迎第一次登陆,%s" % username) core_menu(username) else: print("请输入密码") continue def 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('错误信息,请重新选择') continue def 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*price balance = db_dict[username]['余额'] if cost<=balance: db_dict[username]['余额'] -= cost db_dict[username]['历史记录'].append(option2) # 添加字典value值数据??? save_into_file(db_dict) menu_dict[option1][option2]['数量'] -= num save_into_file(menu_dict, "menu.json") print("商品已购,您的最新余额为 33[34m%d 33[0m" % (db_dict[username]['余额'])) break else: print('账户余额不足,请充值') core_menu(username) else: print("抱歉,商品数目不足") continue elif option2 == 'b': break elif option2 == 'q': sys.exit() else: print('错误信息,请重新选择') continue elif 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()