初學 python 之 購物車程序實現原理


購物車程序要求:

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. 減少重復代碼
  2. 使程序變的可擴展
  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     # 退出
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM