购物车练习
一、需求:
1、启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表
2、允许用户根据商品编号购买商品
3、用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
4、可随时退出,退出时,打印已购买商品和余额
5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示
6、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买
7、允许查询之前的消费记录
二、实现需求:- 达成7项作业需求- 自动去除用户输入前后的空格 - 简单修饰商品列表,购物车列表- 用户输入 s 显示消费记录后,程序暂停。可输入任意键,按回车继续
三、代码
1. 生成包含 账号信息 的pickle文件
1 import pickle 2 3 acc = { 4 'Jailly': 5 { 'pwd':'123', 6 'salary':None, 7 'shopping cart':[]}, 8 'Lily': 9 { 'pwd':'abc',10 'salary':None,11 'shopping cart':[]}12 }13 14 with open('acc.pkl','wb') as f:15 pickle.dump(acc,f)
2. 主程序
1 #! /usr/bin/env python3 2 # -*- encoding:utf-8 -*- 3 # Author:Jailly 4 5 import pickle,getpass 6 7 # 用户登陆 8 def login(): 9 count = 0 10 while count < 3: 11 name_input = input('用户名:').strip() 12 pwd_input = getpass.getpass('密码:') 13 14 if name_input in acc: 15 if acc[name_input]['pwd'] == pwd_input: 16 return name_input 17 else: 18 print('\033[1;31m密码错误\033[0m') 19 count += 1 20 else: 21 print('\033[1;31m您输入的用户名不存在,请重新输入\033[0m') 22 else: 23 print('错误次数太多,程序关闭...') 24 exit() 25 26 27 # 欢迎信息 & 判断是否第一次登陆 28 def welcome(name_input): 29 if acc[name_input]['salary']: 30 salary = acc[name_input]['salary'] 31 print('欢迎,%s'%name_input) 32 print('您的当前余额为\033[1;31m%d\033[0m,愿您购物愉快~' % salary) 33 else: 34 print('欢迎,%s' % name_input) 35 salary = input('请输入您的工资:').strip() 36 37 # 工资输入并判断输入是否正确 38 while 1: 39 if salary.isdigit() and int(salary) >= 0: 40 salary = int(salary) 41 42 break 43 else: 44 salary = input('工资必须为正整数,请重新输入:') 45 return salary 46 47 # 消费记录 48 def show_recode(sc,salary): 49 print('-' * 51) 50 print('|', 'shopping cart'.center(47, ' '), '|') 51 print('-' * 51) 52 for i in sc: 53 print('|', i[0].center(22, ' '), '|', str(i[1]).center(22, ' '), '|') 54 print('-' * 51) 55 print('|',('您的余额为%d' % salary).center(42,' '),'|') 56 print('-' * 51) 57 58 # 选购商品 59 def shopping(name_input,salary): 60 sc = acc[name_input]['shopping cart'] 61 62 while 1: 63 print(' Product List '.center(50,'-')) 64 for k,v in enumerate(product_list): 65 print(('| %s. %s'%(k,v)).ljust(48,' '),'|') 66 print('-'*50) 67 68 choice = input('请输入您想要购买的商品编号:').strip() 69 if choice.isdigit(): 70 choice = int(choice) 71 if 0 < choice < len(product_list): 72 p_item = product_list[choice] 73 salary -= p_item[1] 74 sc.append(p_item) 75 print('您刚购买了\033[;31m%s\033[0m,当前账户余额为\033[1;31m%d\033[0m'%(str(p_item),salary)) 76 else: 77 print('抱歉,没有找到您选择的商品') 78 79 elif choice == 's': 80 show_recode(sc,salary) 81 input('输入回车键继续...') 82 83 elif choice == 'q': 84 show_recode(sc,salary) 85 86 acc[name_input]['salary'] = salary 87 acc[name_input]['shopping cart'] = sc 88 with open('acc.pkl','wb') as f: 89 pickle.dump(acc,f) 90 91 print('感谢您的支持,再见~') 92 exit() 93 94 else: 95 print('\033[1;31m请输入正确的商品编号\033[0m') 96 97 # 主程序 98 def main(): 99 name_input = login()100 salary = welcome(name_input)101 shopping(name_input,salary)102 103 if __name__ == '__main__':104 product_list = [105 ('IPhone', 5000),106 ('Mac Pro', 12000),107 ('xbox360', 2500),108 ('PlayStation3', 2000),109 ('bike', 1000),110 ('kindle', 150)111 ]112 113 with open('acc.pkl', 'rb') as f:114 acc = pickle.load(f)115 116 main()