课堂练习:购物车小练习
对几天来学习的循环,list,if,input,字符转换等小功能做个综合练习
购物车的需求:
# 启动程序后,让用户输入工资,然后打印商品列表
#允许用户根据商品编号购买商品
#用户选择商品后,检测用户余额是否够,够就扣款,不够则提醒
#可以随时退出,退出时打印已购买的商品和余额
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #Author Mike 2 #-----------utf-8-------------- 3 # 启动程序后,让用户输入工资,然后打印商品列表 4 #允许用户根据商品编号购买商品 5 #用户选择商品后,检测用户余额是否够,够就扣款,不够则提醒 6 #可以随时退出,退出时打印已购买的商品和余额 7 #第二版增加了各种容错和部分优化 8 shopcart = [] # 建立一个空列表,用于存放买成功的商品 9 commodity = [("commodity1", 10), ("commodity2", 20), ("commodity3", 30), ("commodity4", 40), ("commodity5", 60)]#建立一个商品的列表,列表的要素为元组(只读列表) 10 while True:#循环开始 11 amt=input("please input your amount:")#获取用户工资,amt变量此时是str类型 12 if amt.isdigit():#如果amt是数字字符串 13 amt=int(amt)#把amt转换为数字 14 while True:#开始第二层循环 15 # for i in commodity: 16 # print(commodity.index(i),i) 17 for index, item in enumerate(commodity):#打印商品列表,通过枚举函数循环打印商品信息 18 print(index, item) 19 purchasecommodity = input("please input your commdity's number")#获取采购商品的编号 20 if purchasecommodity.isdigit():#如果获取的商品编号是数字 21 purchasecommodity=int(purchasecommodity)#把商品编号字符串转变成数字 22 if purchasecommodity > int(len(commodity))-1 or purchasecommodity <0:#如果商品下标超过数组下标,或者为负数 23 print("product is not exist!")#打印错误信息,重新进入第二层循环 24 else:#如果商品编号合法 25 price = commodity[purchasecommodity][-1]#获取商品的价格 26 if amt >= price:#用户的账户余额如果大于商品价格 27 amt = amt - commodity[purchasecommodity][-1]#用户的余额等于原余额-商品价格 28 shopcart.append(commodity[purchasecommodity])#把商品元组添加到购物车数组里,注意这里不能用extend,extend是把嵌套数组的要素添加到数组里,append可以以数组形式添加要素 29 print( "\033[32;1m%s\033[0m is added to your shop cart,your balance is \033[31;1m%s\033[0m"%(commodity[purchasecommodity][0],amt))#打印购买成功信息,包括新的账户余额(红),商品名(绿) 30 else:#用户的钱如果不够,则提示错误 31 print("your balance is not enough") 32 elif purchasecommodity == "q":#如果获取的商品的编号是"q"字符 33 print("your balance is \033[31;1m%s\033[0m" % (amt))#打印用户的amt金额(红色), 34 print("your shop cart:")#打印用户的购物车的内容 35 # for i in shopcart: 36 # print(i) 37 for index, item in enumerate(shopcart):#用枚举函数打印购物车商品 38 print(index, item) 39 exit()#最后退出程序 40 else: 41 print("please input number")#如果用户输入非“q”,也非数字的字符,则提示用户输入数字,并重新进入第二层循环 42 elif amt=="q":#如果amt获取到"q"字符 43 print("bye")#打印错误信息 44 exit()#退出程序 45 else:#如果amt不是数字字符串,也不是q,则重新进入第一层循环 46 print("please input digit")#打印错误信息,循环回输入工资
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #Author Mike 2 #-----------utf-8-------------- 3 # 启动程序后,让用户输入工资,然后打印商品列表 4 #允许用户根据商品编号购买商品 5 #用户选择商品后,检测用户余额是否够,够就扣款,不够则提醒 6 #可以随时退出,退出时打印已购买的商品和余额 7 8 amt=int(input("please input your amount:")) 9 shopcart=[] 10 commodity=[["0","commodity1",10],["1","commodity2",20],["2","commodity3",30],["3","commodity4",40],["4","commodity5",60]] 11 stop=True 12 while stop: 13 for i in commodity: 14 print(i) 15 purchasecommodity=int(input("please input your commdity's number")) 16 if purchasecommodity>4: 17 print("out of range") 18 else: 19 price=commodity[purchasecommodity][-1] 20 if amt>=price: 21 amt=amt-commodity[purchasecommodity][-1] 22 shopcart.append(commodity[purchasecommodity]) 23 print(commodity[purchasecommodity][1]+"is added to your shop cart") 24 else: 25 print ("balance is not enough") 26 countine_confirm = input("agein?Y|N:") # 提示用户选择 27 if countine_confirm == "n": # 用户选择“n”,则退出循环 28 stop = False 29 else: 30 print("your balance is" +str(amt)) 31 print("your shop cart") 32 for i in shopcart: 33 print(i)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #Author Mike 2 #-----------utf-8-------------- 3 import openpyxl 4 filename="d:/shoppingcart.xlsx"#定义文件的绝对路径 5 sheet_commodity="commodity"#定义商品列表表明,存放商品的列表 6 workbook= openpyxl.load_workbook(filename) #打开excel文件 7 try: 8 commoditylist=workbook.get_sheet_by_name(sheet_commodity)#获取商品表 9 except: 10 print ("no sheet in %s named " % filename) 11 commodity={} 12 i=1 13 while i <= commoditylist.max_row: 14 commodity[commoditylist["A"+str(i)].value]=commoditylist["B"+str(i)].value 15 commoditylist["A" + str(i)].value="" 16 commoditylist["B" + str(i)].value="" 17 i+=1 18 # print(commodity) 19 #请选择功能 20 choice=input("请输入功能0,维护商品,1,删除商品") 21 if choice=="0": 22 key=input("请输入商品名:") 23 value=input("请输入商品价格") 24 commodity.setdefault(key,value) 25 # print(commodity) 26 elif choice=="1": 27 key = input("请输入商品名:") 28 commodity.pop(key) 29 else: 30 print("滚") 31 i=1 32 for p in commodity: 33 commoditylist["A" + str(i)].value=p 34 commoditylist["B" + str(i)].value=commodity[p] 35 print(p,commodity[p]) 36 i+=1 37 workbook.save(filename)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #Author Mike 2 #-----------utf-8-------------- 3 #用户入口: 4 #商品信息存在文件里 5 #已购商品,余额信息长期留存 6 import openpyxl 7 #商家入口: 8 #可以添加商品,修改商品价格 9 filename="d:/shoppingcart.xlsx"#定义文件的绝对路径 10 sheet_userinfo="userinfo"#定义用户信息表表名,存放用户的余额 11 sheet_commodity="commodity"#定义商品列表表明,存放商品的列表 12 sheet_shopcart="shopcart"#定义购物车列表,存放用户已购买商品 13 workbook= openpyxl.load_workbook(filename) #打开excel文件 14 try: 15 sheet_user = workbook.get_sheet_by_name(sheet_userinfo) # 获取用户信息表,余额信息 16 except: 17 print ("no sheet in %s named " % filename) 18 userinfo={ #建立一个字典,包含金额和购物车2个1级key,value初始均为空 19 "Amt":"", #金额的key 20 "shopcart":[]#购物车的key,对应的value是该够的商品,是个二级字典 21 } 22 amt=sheet_user["B1"].value#从excel获取用户的余额信息 23 #print (amt) 24 #print(type(amt)) 25 try: 26 sheet_commodity=workbook.get_sheet_by_name(sheet_commodity)#获取商品表 27 except: 28 print ("no sheet in %s named " % filename) 29 sheet_commodity_num_of_rows = sheet_commodity.max_row#获取商品表最大行数,为循环做准备 30 commodity=[]#建立空列表接收文件读取到的商品信息 31 i=1 32 while i <=sheet_commodity_num_of_rows: 33 onecommodity=(str(sheet_commodity["A"+str(i)].value),sheet_commodity["B"+str(i)].value)#获取表数据放进商品单品的元组 34 commodity.append(onecommodity)#添加元组到商品列表 35 i += 1#循环变量+1 36 try: 37 shopcart = workbook.get_sheet_by_name(sheet_shopcart) # 获取用户信息表,余额信息 38 except: 39 print("no sheet in %s named " % filename) 40 41 42 #print (commodity) 43 #commodity = [("commodity1", 10), ("commodity2", 20), ("commodity3", 30), ("commodity4", 40), ("commodity5", 60)]#建立一个商品的列表,列表的要素为元组(只读列表) 44 while True:#循环开始 45 if amt==None:#首先处理amt,如果amt为空则要求用户输入amt 46 amt=input("please input your amount:")#获取用户工资,amt变量此时是str类型 47 if amt.isdigit():#如果amt是数字字符串 48 print(type(amt)) 49 amt=int(amt)#把amt转换为数字 50 elif amt == "q": # 如果amt获取到"q"字符 51 print("bye") # 打印错误信息 52 exit() # 退出程序 53 elif amt>0: 54 p = shopcart.max_row # 获取购物车的表的最大行数 55 while True: # 开始第二层循环 56 # for i in commodity: 57 # print(commodity.index(i),i) 58 for index, item in enumerate(commodity): # 打印商品列表,通过枚举函数循环打印商品信息 59 print(index, item) 60 purchasecommodity = input("please input your commdity's number") # 获取采购商品的编号 61 if purchasecommodity.isdigit(): # 如果获取的商品编号是数字 62 purchasecommodity = int(purchasecommodity) # 把商品编号字符串转变成数字 63 if purchasecommodity > int(len(commodity)) - 1 or purchasecommodity < 0: # 如果商品下标超过数组下标,或者为负数 64 print("product is not exist!") # 打印错误信息,重新进入第二层循环 65 else: # 如果商品编号合法 66 price = commodity[purchasecommodity][-1] # 获取商品的价格 67 if amt >= price: # 用户的账户余额如果大于商品价格 68 amt = amt - commodity[purchasecommodity][-1] # 用户的余额等于原余额-商品价格 69 sheet_user["B1"].value=amt#把用户的最新余额保存到excel 70 userinfo["shopcart"].append(commodity[purchasecommodity]) # 把商品元组添加到购物车数组里,注意这里不能用extend,extend是把嵌套数组的要素添加到数组里,append可以以数组形式添加要素 71 # print (commodity[purchasecommodity][0]) 72 shopcart["A" + str(p)].value = commodity[purchasecommodity][0] # 把已购商品名称加入购物车 73 shopcart["B" + str(p)].value = commodity[purchasecommodity][1] # 把已购商品价格加入购物车 74 p+=1 75 print("\033[32;1m%s\033[0m is added to your shop cart,your balance is \033[31;1m%s\033[0m" % ( 76 commodity[purchasecommodity][0], amt)) # 打印购买成功信息,包括新的账户余额(红),商品名(绿) 77 else: # 用户的钱如果不够,则提示错误 78 print("your balance is not enough") 79 elif purchasecommodity == "q": # 如果获取的商品的编号是"q"字符 80 print("your balance is \033[31;1m%s\033[0m" % (amt)) # 打印用户的amt金额(红色), 81 print("your shop cart:") # 打印用户的购物车的内容 82 for index, item in enumerate(userinfo["shopcart"]): # 用枚举函数打印购物车商品 83 print(index, item) 84 # wb = load_workbook("d:/shoppingcart.xlsx") 85 workbook.save(filename) 86 exit() # 最后退出程序 87 else: 88 print("please input number") # 如果用户输入非“q”,也非数字的字符,则提示用户输入数字,并重新进入第二层循环''' 89 else: # 如果amt不是数字字符串,也不是q,则重新进入第一层循环 90 print("please input digit") # 打印错误信息,循环回输入工资 91 exit()