購物車程序要求:
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 # 退出