购物车程序要求:
1、启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表
2、允许用户根据商品编号选择商品
3、可查看已经选择的商品以及总价,所选商品总价大于工资提醒,
4、选好后确认结算,打印已购买商品和余额,可随时退出
5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示
6、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买
7、允许查询之前的消费记录
目标:
练习文件读写,列表和列表解析,函数使用,循环表达式.
程序流程:
1.开始,读取文本文件内容,商品文本和会员信息文本,生成商品列表,会员名密码工资列表,购物车列表和已购商品列表,进入2
2.输入用户名和密码,用户名密码错误就返回2重新输入,用户名密码正确进入3
3.判断工资是否为默认none,是none就输入工资,更新会员名密码工资列表,数据输出至会员信息文本保存再进入4,不是none直接进入4
4.显示不同操作,
输入q直接退出程序,
输入s进入42,
42.显示商品,选择商品序列把商品加入购物车, 更新列表,数据输出至会员信息文本保存,提示余额状态,再返回4,
输入p进入43,
43.余额充足,即结算购物车,更新各列表,数据输出至会员信息文本保存在返回4,余额不足,显示提示,直接返回4,
输入c进入44,
44.显示购物车商品,
选择要删除的商品序号,从购物车列表中删除,数据输出至会员信息文本保存再返回44,
选择b,返回4.
知识点:
1.文件读写
1 with open('file','r',) as f:
2 ..... # do something
打开文件的模式有:
- r,只读模式(默认)。
- w,只写模式。【不可读;不存在则创建;存在则删除内容;】
- a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
- r+,可读写文件。【可读;可写;可追加】
- w+,写读
- a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
- rU
- r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
- rb
- wb
- ab
2.列表解析表达式
1 >>> list = [[1,2,3],[4,5,6],[7,8,9]]
2 >>> list
3 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
4 >>> col = [m[0] for m in list] # 提取list中各列表的第一个元素创建新列表col
5 >>> col
6 [1, 4, 7]
7 >>>
这个可以很方便的数据处理
3.函数使用,
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
特性:
- 减少重复代码
- 使程序变的可扩展
- 使程序变得易维护
语法定义
1 def sayhi():#函数名
2 print("Hello, I'm nobody!")
3
4 sayhi() #调用函数
可以带参数
1 #下面这段代码
2 a,b = 5,8
3 c = a**b
4 print(c)
5
6
7 #改成用函数写
8 def calc(x,y):
9 res = x**y
10 return res #返回函数执行结果
11
12 c = calc(a,b) #结果赋值给c变量
13 print(c)
4. while 循环和if...else表达式用于控制流程
5. 终端文字颜色显示.
格式:\033[显示方式;前景色;背景色m
说明:
前景色 背景色 颜色
---------------------------------------
30 40 黑色
31 41 红色
32 42 绿色
33 43 黃色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色
显示方式 意义
-------------------------
0 终端默认设置
1 高亮显示
4 使用下划线
5 闪烁
7 反白显示
8 不可见
例子:
\033[1;31;40m <!--1-高亮显示 31-前景色红色 40-背景色黑色-->
\033[0m <!--采用终端默认设置,即取消颜色设置-->
代码:
1 with open('product_list', 'rU', encoding='utf-8') as f,\
2 open('userinfo', 'rU', encoding='utf-8') as f2:
3 # 打开商品列表文件和会员信息文件
4 product_list = [pr.strip().split(',') for pr in f] # 构建商品列表
5 user_info = [u.split() for u in f2] # 构建会员信息列表
6
7 if len(user_info[1]) == 1:
8 cart = [] # 购物车是空
9 else:
10 cart = [c.strip().split(',') for c in user_info[1][1:]] # 去掉购物车标记标签user_info[1][0]
11 for i in cart:
12 i.pop()
13 # 处理多余的列表空元素
14 # 构建购物车列表
15
16 if len(user_info[2]) == 1:
17 purchased = [] # 已购商品为空
18 else:
19 purchased = [pu.strip().split(',') for pu in user_info[2][1:]] # 去掉已购商品标记标签user_info[2][0]
20 for i2 in purchased:
21 i2.pop()
22 # 处理多余的列表空元素
23 # 构建已购商品列表
24 username = user_info[0][0]
25 password = user_info[0][1]
26 salary = user_info[0][2]
27 # 提取信息方便使用
28
29
30 def consume(x):
31 money = 0
32 for gods in x:
33 money += int(gods[1])*int(gods[2])
34 return money
35 # 计算商品总价函数
36
37
38 def my_cart(x):
39 for index, gods in enumerate(x):
40 price = str(int(gods[1])*int(gods[2]))
41 print('%s %s 单价:%s 数量:%s 合计:%s' % (str(index+1), gods[0], gods[1], gods[2], price))
42 print('消费金额: \033[1;36m%s\033[0m' % str(consume(x)))
43 # 打印商品(购物车和已购商品通用)信息函数
44
45
46 def _cart():
47 print('\033[1;34m购物车中的商品如下:\033[0m')
48 my_cart(cart)
49 # 打印购物车信息函数
50
51
52 def _purchased():
53 print('\033[1;34m已购商品如下:\033[0m')
54 my_cart(purchased)
55 # 打印已购商品信息函数
56
57
58 def info():
59 if int(salary) < consume(cart):
60 print('------会员:%s--当前余额:\033[1;31m%s 余额不足无法结算\033[0m------' % (username, salary))
61 else:
62 print('------会员:%s--当前余额:\033[1;36m%s\033[0m------' % (username, salary))
63 _cart()
64 _purchased()
65 # 打印全部信息函数
66
67
68 def menu():
69 for index, pr_message in enumerate(product_list):
70 print(index+1, '%s %s %s' % (pr_message[0], pr_message[1], pr_message[2]))
71 # 打印商品列表函数
72
73
74 def output_to_file():
75 with open('userinfo', 'w', encoding='utf-8') as f3:
76 f3.write('%s %s %s\n' % (username, password, salary))
77 for ca_message1 in cart_output:
78 for ca_message2 in ca_message1:
79 f3.write(ca_message2+',')
80 f3.write('\t')
81 f3.write('\n')
82 for pu_message1 in purchased_output:
83 for pu_message2 in pu_message1:
84 f3.write(pu_message2+',')
85 f3.write('\t')
86 # 数据输出至文本文件函数,更新userinfo文件
87 # 每次更新都是全部信息一起更新(会员信息,购物车,已购商品)
88
89 while True:
90 name = input('输入用户名>>')
91 password = input('输入密码>>')
92 if name == username and password == user_info[0][1]:
93 print('欢迎 %s 回来!' % name)
94 break
95 else:
96 print('用户名密码错误!')
97 # 用户认证,正常情况还需要更细致(不是本次主要练习,简单带过)
98
99 if salary == 'none':
100 while True:
101 salary = input('第一次登录请输入工资>>')
102 if salary.isdigit():
103 cart_output = [['购物车']]+cart
104 # 创建准备输出的购物车的列表
105 purchased_output = [['已购商品']]+purchased
106 # 创建准备输出的已购商品列表
107 output_to_file()
108 # 输出数据,更新userinfo文件
109 break
110 else:
111 print('输入的不是数字!!')
112 # 判断是否第一次登录
113 while True:
114 choice = input('''
115 _______________请选择操作_______________
116 | 输入c进入我的商品,可删除购物车中的商品 |
117 | 输入p结算付款,并退出 |
118 | 输入s选购商品 |
119 |_______________输入q退出________________|
120 >>>''')
121 if choice == 'c':
122 while True:
123 info()
124 c_choice = input('''
125 ______________请选择操作________________
126 | 输入商品序列删除购物车中序列对应商品 |
127 | 输入b返回选择其他操作 |
128 |________________________________________|
129 >>>''')
130 if c_choice.isdigit():
131 if 0 < int(c_choice) <= len(cart):
132 del_name = cart[int(c_choice)-1][0]
133 del_number = cart[int(c_choice)-1][2]
134 cart.pop(int(c_choice)-1)
135 cart_output = [['购物车']]+cart
136 # 创建准备输出的购物车的列表
137 purchased_output = [['已购商品']]+purchased
138 # 创建准备输出的已购商品列表
139 output_to_file()
140 # 输出数据,更新userinfo文件
141 print('\033[1;31m商品: %s 数量: %s 已从购物车中删除\033[0m' % (del_name, del_number))
142 else:
143 print('\033[1;31m商品不存在!\033[0m')
144 elif c_choice == 'b':
145 break
146 continue
147 # 查看购物车和已购商品信息
148 elif choice == 's':
149 print('\033[1;34m----商品列表如下,请选择商品----\033[0m')
150 menu()
151 while True:
152 s_choice = input('输入序列号把商品加购物车>>')
153 s_quantity = input('输入商品数量>>')
154 if s_choice.isdigit():
155 if 0 < int(s_choice) <= len(product_list):
156 choice_product = product_list[(int(s_choice)-1)]
157 # 读取product_list中选择序列对应商品列表
158 cart.append([choice_product[0], choice_product[1], s_quantity])
159 # 把选择的商品加入cart列表中
160 cart_output = [['购物车']]+cart
161 # 创建准备输出的购物车的列表
162 purchased_output = [['已购商品']]+purchased
163 # 创建准备输出的已购商品列表
164 output_to_file()
165 # 输出数据,更新userinfo文件
166 c_name = choice_product[0]
167 c_number = str(s_quantity)
168 print('\033[1;34m商品: %s 数量: %s 已加入购物车\033[0m' % (c_name, c_number))
169 # 提示商品成功加入购物车
170 if int(salary) < consume(cart):
171 a = str(consume(cart))
172 b = salary
173 print('购物车商品总价: \033[1;36m%s\033[0m 余额: \033[1;31m%s 余额不足!\033[0m' % (a, b))
174 print('请进入我的商品,调整购物车里的商品')
175 # 余额不足,提示!
176 break
177 else:
178 a = str(consume(cart))
179 b = salary
180 print('购物车商品总价: \033[1;36m%s\033[0m 余额: \033[1;36m%s 余额充足!\033[0m' % (a, b))
181 break
182 else:
183 print('\033[1;31m商品不存在\033[0m')
184 continue
185 elif choice == 'p':
186 if int(salary) < consume(cart):
187 a = str(consume(cart))
188 b = salary
189 print('购物车商品总价: \033[1;36m%s\033[0m 余额: \033[1;31m%s 余额不足无法结算!\033[0m' % (a, b))
190 print('请进入我的商品,调整购物车里的商品')
191 continue
192 # 余额不足,不能结算
193 else:
194 salary = str(int(salary) - consume(cart))
195 # 计算余额
196 purchased = purchased + cart
197 # 金额结算后,把cart中的商品放入purchased列表中
198 purchased_output = [['已购商品']]+purchased
199 # 创建准备输出的已购商品列表
200 cart = []
201 # 然后cart列表清空,继续中转使用
202 cart_output = [['购物车']]+cart
203 # 创建准备输出的购物车的列表
204 output_to_file()
205 # 输出数据,更新userinfo文件
206 info()
207 # print('欢迎再次光临,再见!')
208 continue
209 # 购物车结算
210 elif choice == 'q':
211 print('欢迎再次光临,再见!')
212 break
213 # 退出