一.作業需求:
1、啟動程序后,輸入用戶名密碼后,如果是第一次登錄,讓用戶輸入工資,然后打印商品列表
2、允許用戶根據商品編號購買商品
3、用戶選擇商品后,檢測余額是否夠,夠就直接扣款,不夠就提醒
4、可隨時退出,退出時,打印已購買商品和余額
5、在用戶使用過程中, 關鍵輸出,如余額,商品已加入購物車等消息,需高亮顯示
6、用戶下一次登錄后,輸入用戶名密碼,直接回到上次的狀態,即上次消費的余額什么的還是那些,再次登錄可繼續購買
7、允許查詢之前的消費記錄
二.購物車用戶信息:
{'name': {'password': '10000'}, 'cx': {'123': '725.0'}, 'even': {'qw': '1560'}, 'cv1': {'1': 100.5}}
以字典形式存儲用戶名,密碼,余額
三.歷史購物信息:
{'name': [['iphone', 5800], ['bike', 800]], 'cx': [['iphone', 5800], ['apple', 5], ['apple', 5], ['book', 75]]}
以字典形式,對應用戶名和歷史購物記錄
四.流程圖:
五.代碼:(python3.6,mac環境):

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author: Even 4 5 set = False # 設置set 當輸入為q就可以退出 6 file = open('購物車用戶信息存檔','r+',encoding='utf-8') # 讀取購物車用戶信息文件 7 f = str(file.read()) # 將文件內容轉化成字符串 8 for line in f: # 逐行讀取 9 file_str = str(f) 10 data= eval(file_str) # 將字符串轉換為字典data 11 name = input("請輸入姓名:") # 提示輸入用戶名 12 password = input("請輸入密碼:") # 提示輸入密碼 13 while True: 14 if name in data: # 用戶名在字典data 15 if password in data[name]: # 密碼如果能對應用戶名,就歡迎登錄 16 salay = float(data[name][password]) 17 print('''\033[32;1m歡迎登錄,當前余額為%s\033[0m'''%salay) 18 break 19 else: # 否則密碼輸入錯誤,提示重新輸入 20 password = input("密碼輸入錯誤,請重新輸入:") 21 continue 22 else: # 否則判斷為首次登錄,將用戶名,密碼,工資存到用戶信息文件中 23 password_salay = {} 24 salay_str = input("歡迎首次登錄,請輸入你的工資:") # 輸入工資數 25 salay = float(salay_str) # 將輸入的字符串轉換為數字 26 password_salay[password] = salay # 將工資對應到密碼 27 data[name] = password_salay # 將密碼-工資對對應到用戶名 28 file.seek(0) # 文件的讀取移到開頭 29 file.write(str(data)) # 寫入新的字典信息 30 file.tell() # 返回當前位置 31 break 32 33 34 list = [ # 購物清單 35 ["iphone",5800], 36 ["bike",800], 37 ["macbook",17500], 38 ["book",75], 39 ["apple",5] 40 ] 41 42 file_list_r = open('歷史購買記錄','r+',encoding='utf-8') # 讀取歷史購買記錄文件 43 f_list_r = str(file_list_r.read()) 44 shoppinglist_dict = eval(f_list_r) # 將歷史記錄信息轉換為字典 45 if name not in shoppinglist_dict: # 如果首次登錄,會沒有歷史記錄 46 shoppinglist_dict[name] = [] # 首次登錄歷史記錄留空 47 shoppinglist = shoppinglist_dict[name] # 不是首次登錄,將之前歷史記錄賦值到變量 48 shoppinglist_now = [] # 本次購物記錄留空 49 choose = input("\n是否需要查詢歷史購物記錄(y/n):") # 詢問是否需要查詢歷史記錄 50 if choose == 'y': # 選y,輸出歷史購物記錄 51 print("\n\n-----------歷史購物記錄------------") 52 print(shoppinglist) 53 print("--------------結束---------------\n\n") 54 55 while not set: # 購物車開始 56 print('-----------商品清單------------') # 輸出商品清單 57 for index,item in enumerate(list,1): 58 print(index,item) 59 print("-------------結束--------------") 60 number = input("請輸入想購買的商品編號:") # 輸入商品編號 61 if number == "q": # 當輸入為q,退出,打印本次購物清單 62 set = True 63 data[name][password] = str(salay) # 將字符串的工資給到對應用戶名下的密碼-工資對中 64 file.seek(0) 65 file.write(str(data)) # 將用戶信息寫入購物車用戶信息存檔中 66 file.tell() 67 print("------------購物清單------------") # 打印購物清單,提示余額 68 print(shoppinglist_now) 69 print("您的余額為:",salay) 70 print("-------------結束--------------") 71 shoppinglist.extend(shoppinglist_now) # 將本次購物記錄追加到購物記錄列表中 72 shoppinglist_dict[name] = shoppinglist # 購物列表與用戶名做對應 73 file_list_r.seek(0) 74 file_list_r.write(str(shoppinglist_dict)) # 寫入字符串的購物歷史記錄 75 file_list_r.tell() 76 elif number.isdigit() == False: # 校驗輸入是否為整數 77 print("\033[31;1m輸入不是編號內容,請重新輸入\033[0m") 78 elif int(number)>int(len(list)) or int(number)<= 0: # 如果輸入值不在清單中,提示報錯 79 print("\033[31;1m您所購買的商品不在清單中\033[0m") 80 else: 81 number_buy = int(number)-1 82 if list[number_buy][1]<(salay): # 如果余額夠,提示成功購買,顯示余額 83 salay = salay - int(list[number_buy][1]) 84 msg = ''' 85 \033[32;1m您已將%s加入購物車中 86 余額為%d\033[0m 87 ''' % (list[number_buy][0],salay) 88 print(msg) 89 shoppinglist_now.append(list[number_buy]) # 本次購物信息加到本次購買記錄中 90 else: 91 print("\033[31;1m您已沒有余額可以購買\033[0m") # 否則提示余額不足