作业要求
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
- 函数的返回值 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%d 33[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()