在网上看到了金角大王(Alex)老师的课,老师讲课很幽默,开始记录每一次学习作业的内容,欢迎大家交流以及代码的使用。
1. day2作业内容
程序:购物车程序
需求:
1.启动程序后,让用户输入工资,然后打印商品列表
2.允许用户根据商品编号购买商品
3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
4.可随时退出,退出时,打印已购买商品和余额
5.用户入口:
5.1商品信息存储在文件里
5.2已购商品,余额的记录(采用文本储存)
6.商家入口:
6.1可添加商品,修改商品价格
2. day2代码
登入时需先输入账户名称,管理员账号:PyDragon,用户账号:大龙 。对应了两个不同的操作界面,并每次结束程序和开始程序时都从本地文本文件中读取列表信息,实现数据在本地的存储。
具体代码如下:
#coding:utf-8
#引入python内置函数os
import os
#购物系统类
class shoppingSystem():
FoodName = None
FoodCost = 0
Function = None
Cost = 0
System = True
UserName = None
Salary = 0
Money = 0
user_and_salaryList = [["大龙",0]]
productList = []
buyList = []
tplt = "{0:>4}\t{1:>4}\t{2:>6}"
# {1:{3}^8} 1表示位置,{3}表示用第3个参数来填充,^表示居中,8表示占8个位置,chr(12288)中文空格
tplt_1 = "{0:>4}\t{1:{3}^8}\t{2:>0}"
#数据文件导入初始化
def init_file(self):
self.read_data(self.buyList,'buyList')
self.read_data_2(self.productList,'productList')
#用户名登入
def MainShop(self):
self.read_money('money')
self.UserName = input("输入用户名:")
if self.GM():
self.GM_display()
self.GM_function()
elif self.check_user():
self.display()
self.buy()
else:
print("用户名不存在,请重新输入")
self.MainShop()
#判断是否为管理员用户名
def GM(self):
if self.UserName == 'PyDragon':
return 1
#主界面显示
def display(self):
print(self.tplt.format('购买编号','食物名称','单价(元)',chr(12288)))
for index,item in enumerate(self.productList):
print(self.tplt_1.format(index,item[0],item[1],chr(12288)))
print('当前账户剩余:'+str(self.Money)+'元')
print('已购清单(F) 退出系统(Q)')
#管理员主界面显示
def GM_display(self):
print('----------------管理员后台界面-----------------')
print('增加食品(A) 删除食品(D) 修改价格(C) 查询菜单(L)')
print('退出系统(Q)')
print('-----------------------------------------------')
#管理员功能
def GM_function(self):
self.Function = input("执行功能按键编号:")
if self.Function == 'a':
self.function_a()
elif self.Function == 'd':
self.function_d()
elif self.Function == 'c':
self.function_c()
elif self.Function == 'l':
self.function_l()
elif self.Function == 'q':
self.save_data_2(self.productList,'productList')
exit()
else:
print('输入错误,请重新输入执行功能')
self.GM_function()
#管理员更改食物价格
def function_c(self):
self.FoodName = input("输入要更改的食物名称:")
self.FoodCost = input("输入"+'\033[1;32;0m'+str(self.FoodName)+'\033[0m'+"新价格")
if self.FoodCost.isdigit():
if not self.check_food():
i = self.find_food_number()
self.productList[i][1] = self.FoodCost
print(('\033[1;32;0m'+str(self.FoodName)+'\033[0m')+'修改成功')
print('继续修改(C) 返回主菜单(R)')
choose = input()
if choose == 'c':
self.function_c()
elif choose == 'r':
self.GM_display()
self.GM_function()
else:
print('输入错误,自动返回主菜单')
self.GM_display()
self.GM_function()
else:
print('食物名重复,请重新核对输入')
self.function_a()
else:
self.GM_display()
print('\033[1;31;0m价格非法输入,退回至主菜单\033[0m')
self.GM_function()
#管理员添加食物功能
def function_a(self):
self.FoodName = input("输入食物名称:")
self.FoodCost = input("输入"+'\033[1;32;0m'+str(self.FoodName)+'\033[0m'+"单价")
if self.FoodCost.isdigit():
if self.check_food():
self.productList.append([self.FoodName,int(self.FoodCost)])
print(('\033[1;32;0m'+str(self.FoodName)+'\033[0m')+'添加成功')
print('继续添加(A) 返回主菜单(R)')
choose = input()
if choose == 'a':
self.function_a()
elif choose == 'r':
self.GM_display()
self.GM_function()
else:
print('输入错误,自动返回主菜单')
self.GM_display()
self.GM_function()
else:
print('食物名重复,请重新核对输入')
self.function_a()
else:
self.GM_display()
print('\033[1;31;0m价格非法输入,退回至主菜单\033[0m')
self.GM_function()
#管理员查看食物功能
def function_l(self):
self.show_food()
print('返回主菜单(R)')
choose = input()
if choose == 'r':
self.GM_display()
self.GM_function()
else:
print('输入错误,自动返回主菜单')
self.GM_display()
self.GM_function()
#管理员删除食物功能
def function_d(self):
self.FoodName = input('请输入要删除的食物名称:')
if self.check_food():
print('食物名称不存在,请检查确认后重新输入')
self.function_d()
for i in range(len(self.productList)):
if self.FoodName == self.productList[i][0]:
self.productList.remove(self.productList[i])
print("删除"+'\033[1;31;0m'+str(self.FoodName)+'\033[0m'+"成功")
break
print('继续删除(D) 返回主菜单(R)')
choose = input()
if choose == 'd':
self.function_d()
elif choose == 'r':
self.GM_display()
self.GM_function()
else:
print('输入错误,自动返回主菜单')
self.GM_display()
self.GM_function()
#展示食物清单
def show_food(self):
print('------------食物清单-------------')
print(self.tplt.format('购买编号','食物名称','单价(元)',chr(12288)))
for index,item in enumerate(self.productList):
print(self.tplt_1.format(index,item[0],item[1],chr(12288)))
print('---------------------------------')
#检查食物是否重名
def check_food(self):
for i in range(len(self.productList)):
if self.FoodName == self.productList[i][0]:
return 0
else:
return 1
#c查询食物编号
def find_food_number(self):
for i in range(len(self.productList)):
if self.FoodName == self.productList[i][0]:
return i
else:
return -1
#用户名核对
def check_user(self):
for i in range(len(self.user_and_salaryList)):
if self.UserName == self.user_and_salaryList[i][0]:
self.Salary = input("认证成功,输入存储金额:")
try:
self.user_and_salaryList[i][1] += int(self.Salary)
self.Money += self.user_and_salaryList[i][1]
except Exception as e:
print("请输入纯数字金额,异常:",e)
self.check_user()
return 1
#购买功能
def buy(self):
while self.System:
choose = input("输入你所要购买的食物编号:")
if choose == 'q':
self.save_data_1(self.buyList,'buyList')
self.save_data_2(self.productList,'productList')
self.save_money('money')
print('-----------------------')
print('欢迎使用本系统,下次再见')
print('-----------------------')
exit()
elif choose == 'f':
print('------------购买清单--------------')
for i in self.buyList:
print(i)
print('账户当前余额:',self.Money)
print('----------------------------------')
self.return_way()
elif choose.isdigit():
choose = int(choose)
if 0 <= choose < len(self.productList):
if self.Money >= self.productList[choose][1]:
self.Money -= self.productList[choose][1]
self.Cost += self.productList[choose][1]
self.buyList.append(self.productList[choose][0])
self.display()
print("-------------------------------------")
print('购买成功,请继续输入编号购买或按Q键退出')
print("-------------------------------------")
else:
self.display()
print("-------------------")
print("余额不足,请重新选择")
print("-------------------")
self.buy()
else:
print("-----------------")
print("请输入有效食物编号")
print("-----------------")
else:
print('输入错误')
self.buy()
#返回上级菜单
def return_way(self):
R = input('按R键返回上一级菜单')
if R == 'r':
self.display()
else:
self.return_way()
#存储一维清单列表至本地文件
def save_data_1(self,self_list,list_name):
file_handle = open(list_name+'.txt','w',encoding="utf-8")
for item in self_list:
file_handle.write(item)
file_handle.write('\n')
file_handle.close()
#存储二维清单列表至本地文件
def save_data_2(self,self_list,list_name):
file_handle = open(list_name+'.txt','w',encoding="utf-8")
#删除原文件数据再写入
file_handle.truncate()
for item in self_list:
file_handle.write(str(item[0]))
file_handle.write(' ')
file_handle.write(str(item[1]))
file_handle.write('\n')
file_handle.close()
#读取二维清单列表内容
def read_data_2(self,self_list,list_name):
rs = os.path.exists(list_name+'.txt')
if rs == True:
file_handle = open(list_name+'.txt',mode='r',encoding="utf-8")
contents = file_handle.readlines()
for msg in contents:
#去除\n
msg = msg.strip('\n')
#使用 空格分割存储成一维数组food
food = msg.split(' ')
food[1] = int(food[1])
self_list.append(food)
file_handle.close()
#读取一维清单列表内容
def read_data(self,self_list,list_name):
rs = os.path.exists(list_name+'.txt')
if rs == True:
# 1,打开文件
file_handle = open(list_name+'.txt',mode='r',encoding="utf-8")
#2.读取所有行
contents = file_handle.readlines()
#3.取出每一个元素
for msg in contents:
msg = msg.strip('\n')
self_list.append(msg)
file_handle.close()
#存储Money至本地文件
def save_money(self,list_name):
file_handle = open(list_name+'.txt','w',encoding="utf-8")
file_handle.truncate()
file_handle.write(str(self.Money))
file_handle.close()
#读取Money
def read_money(self,list_name):
rs = os.path.exists(list_name+'.txt')
if rs == True:
file_handle = open(list_name+'.txt',mode='r',encoding="utf-8")
try:
self.Money = int(file_handle.readline())
except Exception as e:
print("请检查文件中的数据是否正确,异常:"+ str(e) )
finally:
file_handle.close()
#window系统执行入口
if __name__ == '__main__':
shoppingSystem().init_file()
shoppingSystem().MainShop()
3. 总结
3.1 如果要对数据进行添删改查时注意不要使用元组,元组不能进行更改,这里要使用列表
3.2 元组通常用于创建不可更改的数据,并告诉使用者这个数据不能更改
3.3 通过引号隔开对可变参数进行字体颜色的修改 '\033[1;31;0m'+str(self.FoodName)+'\033[0m'
3.4 在进行判断时用 == ,在进行赋值时用 =
"IE编程改善分析:敲代码是最快提升你编程能力的手段" ——————————by.PyDragon