1. 程式人生 > >python學習--購物車4

python學習--購物車4

目錄 lease nco div 商品 修改 strip 依據 信息

模擬購物車的程序,是對之前學習的基礎知識----字典、列表、文件的讀寫、字符的操作等知識的一次模擬練習,但在實際的編程中,將所有功能放在一個函數中實現,無疑減弱了程序的可讀性和可維護性,購物車4引進了函數的概念,也將購物車需求經過整理如下:

要求

1、 登錄功能

1> 登錄驗證:1、賬戶是否被鎖定;2、驗證用戶為註冊用戶,登錄密碼是否正確,用戶名與密碼存放在文件中;

2> 驗證失敗三次,鎖定賬戶,鎖定賬戶在五分鐘內不能再次登錄,鎖定賬:

戶存放在文件中。

2、 賬戶充值

1> 在購物時,出現余額不足是,可進行賬戶充值;

2> 可讀取、保存賬戶余額。

3、 退出結算

1> 結束購物時,進行購物結算,打印消費信息與賬戶余額;

2> 購物結束時,保存購物商品信息;

3> 購物結束時,保存賬戶余額。

4、 購物

1> 打印操作說明;

2> 打印商品列表;

3> 商品分類;

4> 余額不足提示。

5> 購物操作,可根據不同購物類型,選擇,顯示該類型下商品列表,可選擇返回上層目錄。

實現代碼如下:

def readDirInfo(filename):
    讀取字典列表,依據傳遞的文件名,獲取不同的字典信息
    nameList = ‘‘
    with open(filename, 
a+, encoding=utf8) as f: f.seek(0) nameList = str(f.readlines()) nameList = nameList.strip(]).strip([) nameList = nameList.strip(\").strip(\") if len(nameList) == 0: return {} return eval(nameList) #字符轉字典 def login(iTime = 3): 用戶登錄操作,包括以下功能:1、判斷是否為註冊賬戶; 2、登錄賬戶是否被鎖定(註:默認輸錯用戶名密碼三次後,鎖定賬號,五分鐘內不能登錄)
i = 1 flag = False lock_namelist = readDirInfo(locklist.txt) while i <= iTime: username = input("username:") password = input("password:") if loginLock(username,lock_namelist): print("you username is locked, try again after 5 min") break elif logincheck(username,password): print("welecom to shopping maket") flag = True break elif i == iTime: print("input more than three times, try again after 5 min") addLockDir(username, lock_namelist) break else: print("you put an wrong name or password,please input again") i += 1 return flag,username def loginLock(name, lock_namelist): 判斷登錄賬號是否被鎖定,如果被鎖定時間超過5分鐘,允許用戶再次登錄 flag = False if name in lock_namelist: last_time = datetime.datetime.strptime(lock_namelist[name], "%Y-%m-%d %H:%M:%S") now_time = datetime.datetime.now() minute = (now_time - last_time) if int(minute.seconds/60) <= 5: flag = True return flag def logincheck(name,password): 是否為註冊賬號 flag = False name_dir = readDirInfo(name.txt) if name in name_dir: if password == name_dir[name]: flag = True return flag def addLockDir(name,lock_namelist): 字典中添加元素,如果元素存在,修改元素的值 if name in lock_namelist: lock_namelist[name] = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S") else: lock_namelist[name] = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S") with open(locklist.txt, w, encoding="utf8") as f_read: f_read.write(str(lock_namelist)) def PrintOper(): 打印操作說明 prolist = ‘‘‘ *************** 系統操作說明 **************** q : 退出系統 c : 賬號充值 h : 購物記錄 l : 商品列表 ************************************************ ‘‘‘ print(prolist) def CreateDir(): 判斷文件夾是否存在,如果存在則退出,如果不存在,創建文件夾 isExists = os.path.exists(History) if not isExists: os.mkdir(History) return isExists def Exit(): 退出購物系統,退出時進行購物結算 Account() saveLevelMoney() exit() def saveLevelMoney(): with open(remain.txt,w,encoding=utf8) as f: f.write(str(remain_dir)) def Account(): 購物計算,將購物信息寫入購物歷史文件中 if len(shopping_cart) == 0: return False print("\033[34;1m---------------product list-----------------\033[0m \n \033[42;1m") temp = id product number pric Totalpric print(temp) index = 1 total_mon = 0 f = open("product.txt", "a+", encoding="utf8") now_time = datetime.datetime.now().strftime([%Y-%m-%d %H:%M:%S]) f.write(now_time + \n + temp + \n) temp = ‘‘ for i in shopping_cart.keys(): total_mon += shopping_cart[i][1] * shopping_cart[i][0] temp = str("%d %10s %7d %7d %7d \n" % (index, i, shopping_cart[i][1], shopping_cart[i][0], shopping_cart[i][1] * shopping_cart[i][0])) print(temp) f.write(temp) index += 1 f.close() print("you pay money is:%d \n you level money is: %d \n" % (total_mon, remain_dir[name])) print("\033[0m \n \033[34;1m-------------end-------------\033[0m") def Recharge(): 賬號充值操作 while True: temp = input("Please rechange money:") if temp.isdigit(): if name in remain_dir: remain_dir[name] += int(temp) else: remain_dir[name] = int(temp) break print("you input a unknow number,please check it and input again!") def History(): 打印歷史購物記錄 filename = History\\ + name + .txt filename = filename.rstrip("\\") print(filename) if os.path.exists(filename): with open(filename,r,encoding=utf8) as f: for line in f: print(line.strip(\n)) else: print(No you shoppong history) def Operation(): 用戶交互操作 while True: PrintOper() oper = str(input("Please input you choice:")).strip() if oper == l: print(歡迎進入購物中心) shopping(product_list) elif oper in Oper_dir: Oper_dir[oper]() else: print("You input no in Oper list!") continue def ProductList(print_list): 打印商品列表 if isinstance(print_list, dict): # 是否為列表 for key in print_list: print(key) else: index = 0 for product in print_list: print(index, product) index += 1 print(b:,返回上級菜單) print(q:,退出購物中心) print(c,充值) def shopping(product_list): 購物操作 current_layer = product_list while True: ProductList(current_layer) choice = input(">>:").strip() if len(choice) == 0: continue if choice.isdigit(): choice = int(choice) if choice >= 0 and choice < len(current_layer): product = current_layer[choice] if product[1] <= remain_dir[name]: if product[0] in shopping_cart: shopping_cart[product[0]][1] += 1 else: shopping_cart[product[0]] = [product[1], 1] remain_dir[name] -= product[1] print("\033[42;1mAdded product: %s into shoing cart ,you current balance %s \033[0m" % (product[0], str(remain_dir[name]))) else: print("\033[42;1m [warning] you balance is no enough\033[0m, product:" + str( product[1]) + " short for " + str(product[1] - remain_dir[name])) else: print("\033[41;1mYou choice product is no in product_list\033[0m") elif choice in current_layer: if isinstance(current_layer, dict): # 是否為列表 last_layer.append(current_layer) current_layer = current_layer[choice] elif choice == q: break elif choice == b: current_layer = BackUpLevel(current_layer) elif choice == c: Recharge(name) def BackUpLevel(current_layer): 返回到商品列表上一層 if last_layer: current_layer = last_layer[-1] last_layer.pop() return current_layer import datetime import os product_list = {"生活用品":[[毛巾,20], [洗衣液,80], [衣架, 10], [洗衣粉,60], [洗發水, 80], [廁洗劑,50]], "家電":[[電視機,5000], [電飯煲,300], [電磁爐,200], [高壓鍋,800], [電餅鐺,200]], } shopping_cart = {} Oper_dir = {q:Exit,c:Recharge,h:History} last_layer = [ product_list ] remain_dir = readDirInfo(remain.txt) flag,name = login() if flag: Operation()

python學習--購物車4