練習—購物車編寫

来源:http://www.cnblogs.com/melonjiang/archive/2016/01/14/5129012.html
-Advertisement-
Play Games

購物車一、具體實現功能:1.用戶的註冊、登錄、充值、餘額查詢2.顯示商品列表、價格、庫存,顯示購物車內商品和數量3.對購物車內商品能進行減少二、具體流程圖三、代碼實現1.用到文件goods.txt1,apple,1500,1002,banana,2000,1003,orange,500,1004,p...


購物車

一、具體實現功能:

1.用戶的註冊、登錄、充值、餘額查詢

2.顯示商品列表、價格、庫存,顯示購物車內商品和數量

3.對購物車內商品能進行減少

二、具體流程圖

三、代碼實現

1.用到文件goods.txt

1,apple,1500,100
2,banana,2000,100
3,orange,500,100
4,pear,5000,100

2.為了存取方便、把goods.txt信息序列化寫入goods_1.txt,再把一個空字典序列化到user.txt,裡面存儲著用戶名、密碼、餘額(不過要先註冊才有)。

之後用到的文件就是goods_1.txt和user.txt兩個了

python2.7

#把物品信息序列化成totallist列表
import pickle
def get_out():
    totallist=[]  #商品信息總列表
    f=file('goods.txt','r')
    list=f.readlines()
    for line in list:
        aa=(line).strip().split(',')
        alist=[aa[0],[aa[1],aa[2],int(aa[3])]]
        totallist.append(alist)
    with open("goods_1.txt","w") as o:
        pickle.dump(totallist,o)    #把新的totallist序列化寫入文件

    #先寫一個空字典到賬戶文存儲件user.txt
    dic={}
    with open("user.txt","w") as o:
        pickle.dump(dic,o)
get_out()
View Code

python3.4貌似還是用二進位rb,wb來序列和反序列文件比較不會報錯

#把物品信息序列化成totallist列表
def get_out():
    totallist=[]  #商品信息總列表
    f=open('goods.txt','rb')
    list=f.readlines()
    for line in list:
        aa=(line).strip().split(',')
        alist=[aa[0],[aa[1],aa[2],int(aa[3])]]
        totallist.append(alist)
    with open("goods_1.txt","wb") as o:
        pickle.dump(totallist,o)    #把新的totallist序列化寫入文件

    #先寫一個空字典到賬戶文存儲件user.txt
    dic={}
    with open("user.txt","wb") as o:
        pickle.dump(dic,o)
get_out()
View Code

這段代碼執行過後就可以拋棄它了(只是為了存取方便)

3、正式代碼

python2.7

  1 #!/usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3 import pickle
  4 import time
  5 #註冊
  6 def register():
  7     while True:
  8         with open("user.txt","r") as o:
  9             dic=pickle.load(o)
 10             name=raw_input("請輸入註冊帳號:")
 11             if name in dic.keys():
 12                 print("帳號已存在,請重新輸入!")
 13                 continue
 14             else:
 15                 pwd=raw_input("請輸入密碼:")
 16             dic[name]=[pwd,0,0]
 17             print("註冊成功")
 18             with open("user.txt","w") as o:
 19                 pickle.dump(dic,o)
 20             break
 21 #登錄
 22 def login_login():#驗證用戶名密碼是否正確
 23      while True:
 24         username=raw_input("請輸入賬戶名:")
 25         with open("user.txt","r") as o:
 26             dic=pickle.load(o)  #取出已經序列化的字典,變成可讀的字典
 27         if username in dic.keys():  #如果賬戶名存在
 28             count=dic[username][2]  #讀取字典里的輸錯次數,count為輸錯的次數
 29             while True:
 30                 if count<3:
 31                     pwd=raw_input("請輸入密碼:")
 32                     if dic[username][0] == pwd:
 33                         print ("登錄成功!")
 34                         time.sleep(1)
 35                         loginmod(username)
 36                         break
 37                     else:
 38                         count = count+1 #錯誤一次,count加1
 39                         print ("密碼錯誤")
 40                         continue
 41                 else:
 42                     print ("帳號已被鎖定")      #輸錯3次後鎖定賬戶
 43                     dic[username][2]=3       #把該卡號的錯誤次數改為3
 44                     with open("user.txt","w") as o:
 45                         pickle.dump(dic,o)       #重新寫入文件
 46                         exit()
 47         else:
 48             print ("賬號名錯誤")
 49             continue
 50         break
 51 #購物實現
 52 def shopping(usname):
 53     buy_count=0 #購買物品的總價格
 54     buy_dic={}  #用來放已購買物品的字典
 55     buy_string=""   #用來顯示購物車信息的字元串
 56     with open("goods_1.txt","r") as o:
 57         totallist=pickle.load(o)
 58     while True:
 59         print("%s購物車:%s")%("商品列表".ljust(65),buy_string)
 60         print("-----------------------------------")
 61         print("%-16s%-16s%-16s%-16s")%("編號","商品","價格","庫存")
 62         for key in totallist:
 63             print("%-14s%-14s%-14s%-14s")%(key[0],key[1][0],key[1][1],key[1][2])#列出列表裡的物品
 64         print("0 : 結算  exit : 退出  q : 返回 # : 購物車")
 65         print("-----------------------------------")
 66         name=raw_input("請選擇要購買的商品:")
 67         try:
 68             if name in str(range(1,len(totallist)+1)):  #如果選擇的數字在range(列表長度)中
 69                 things=totallist[int(name)-1][1][0]      #所選商品
 70                 cost=int(totallist[int(name)-1][1][1])   #所選商品的價格
 71                 if totallist[int(name)-1][1][2]<=0: #判斷是否還有庫存
 72                     print("庫存不足,請重新選擇!")
 73                     continue
 74                 print("%s%s")%("你選擇了".rjust(20),things.center(6))
 75                 buy_count=buy_count+cost    #選擇商品總共的錢
 76                 if things in buy_dic.keys():#如果選擇的物品已經在購物車字典里則數量+1
 77                     buy_dic[things]+=1
 78                 else:                       #否則,創建一個新的key,value
 79                     buy_dic[things]=1
 80                 li_1=cut_down(buy_dic)  #把購買物品的字典buy_dic傳入cut_down函數,並把返回的值賦給li_1
 81                 buy_string="   ".join(li_1)
 82                 totallist[int(name)-1][1][2] -= 1   #記憶體中商品對應的存庫減1
 83             elif name == "0":
 84                 while True:
 85                     outinput=raw_input("是否結賬y/n:")
 86                     if outinput == "y":
 87                         with open("user.txt","r") as o:
 88                             dic=pickle.load(o)  #序列化,變成可讀的字典
 89                         money=dic[usname][1]   #該帳號的剩餘金錢
 90                         buy_money=buy_count    #購買的商品的總價格
 91                         if money<buy_money:
 92                             update_name=raw_input("帳號餘額不足,是否修改購物車商品!y/n")
 93                             if update_name=="y":
 94                                 ccc=add_to(totallist,buy_dic,buy_money)
 95                                 totallist,buy_dic,buy_count=ccc[0],ccc[1],ccc[2]    #把返回的值依次賦值
 96                                 li_2=cut_down(buy_dic)#把購買物品的字典buy_dic傳入cut_down函數,並把返回的值賦給li_1
 97                                 buy_string="   ".join(li_2) #把列表變成字元串來顯示
 98                                 break
 99                             elif update_name=="n":
100                                 print ("帳號餘額不足,請充值!")
101                                 exit()
102                         else:
103                             with open("goods_1.txt","w") as o:#結賬後把記憶體里新的列表寫入文件
104                                 pickle.dump(totallist,o)
105                             #-------------------------------
106                             money=money-buy_money   #購買成功後剩餘的錢
107                             dic[usname][1]=money    #修改剩餘的錢
108                             with open("user.txt","w") as o:#新的dic寫入文件
109                                 pickle.dump(dic,o)
110                             print ("結算成功,你購買的物品有:%s")%buy_string
111                             bbb=raw_input("是否要退出程式y/n:")
112                             if bbb == "y":
113                                 exit()
114                             elif bbb=="n":
115                                 buy_dic={}
116                                 buy_string=""
117                                 break
118                             else:
119                                 print ("請輸入y/n!")
120                     elif outinput == "n":
121                         break
122                     else:
123                         print ("請輸入y/n!")
124             elif name == "exit":
125                 exit()
126             elif name == "#":
127                 ccc=add_to(totallist,buy_dic,buy_count)
128                 totallist,buy_dic,buy_count=ccc[0],ccc[1],ccc[2]
129                 li_2=cut_down(buy_dic)#把購買物品的字典buy_dic傳入cut_down函數,並把返回的值賦給li_1
130                 buy_string="   ".join(li_2) #把列表變成字元串來顯示
131                 continue
132             elif name == "q":
133                 break
134             else:
135                 print("輸入錯誤!".rjust(25))
136         except Exception:
137                 print ("輸入錯誤!".rjust(25))
138 
139 #把buy_dic里的元素變成列表
140 def cut_down(buy_dic):
141     li_1=[]
142     for k,v in buy_dic.items():
143         str="%s:%s"%(k,v)
144         li_1.append(str)
145     return li_1
146 
147 #把購物車的商品放回商店
148 def add_to(totallist,buy_dic,buy_money):
149     print("購物車")
150     while True:
151         n=1
152         li_1=[]
153         for k,v in buy_dic.items():
154             if v==0:        #判斷購物車內商品是否為0,如果是則刪除刪除商品
155                 buy_dic.pop(k)
156                 continue
157             li=[n,[k,v]]
158             li_1.append(li)
159             n = n+1
160         print("%-12s%-12s%-12s")%("編號","商品","數量")
161         for key in li_1:
162             print("%-10s%-10s%-10s")%(key[0],key[1][0],key[1][1])#列出列表裡的物品
163         print("q 返回")
164         aa=raw_input("請選擇要退貨的商品!")
165         if aa in str(range(1,len(li_1)+1)):
166             things=li_1[int(aa)-1][1][0]      #所選商品
167             if buy_dic[things]>0:       #如果購物車內的商品數量大於0
168                 buy_dic[things]-=1       #數量-1
169                 for thin in totallist:      #迴圈totallist
170                     if thin[1][0]==things:      #如果找到迴圈totallist內和該物品一樣時
171                         id=thin[0]       #找出該物品在totallist內的id
172                         totallist[int(id)-1][1][2] += 1     #totallist內該物品數量回+1
173                         price=totallist[int(id)-1][1][1]
174                         buy_money=buy_money-int(price)
175                 continue
176             else:
177                 print("購物車已沒有該物品!")
178         elif aa=="q":
179             break
180         else:
181             print("輸入錯誤!")
182     return totallist,buy_dic,buy_money
183 #充值
184 def pay(usname):
185      while True:
186         input_cash=raw_input("請輸入充值金額:")
187         if input_cash.isdigit():
188             with open("user.txt","r") as o:
189                 dic=pickle.load(o)
190             money=dic[usname][1]
191             left_money=int(money)+int(input_cash)
192             print ("充值%s,餘額%s"%(input_cash,left_money))
193             dic[usname][1]=left_money   #把剩餘的錢寫入字典
194             with open("user.txt","w") as o:
195                 pickle.dump(dic,o)  #重新寫入文件
196                 break
197         else:
198             print ("請輸入數字!")
199 
200 #查詢餘額
201 def demand(usname):
202     with open("user.txt","r") as o:
203         dic=pickle.load(o)
204         money=dic[usname][1]
205         print ("你的可用餘額還有:%s")%money
206 
207 #登錄成功後顯示
208 def loginmod(usname):
209     while True:
210         print '1、查詢 2、購物 3、充值 q、返回 exit、退出'
211         inp = raw_input("請選擇:")
212         if inp == "1":
213             demand(usname)
214         elif inp == "2":
215             shopping(usname)
216         elif inp == "3":
217             pay(usname)
218         elif inp == "q":
219            return
220         elif inp == "exit":
221            exit()
222 
223 #主程式
224 if __name__ == "__main__":
225     while True:
226         print("1、註冊 2、登錄 exit、退出")
227         aa=raw_input("請選擇:")
228         if aa == "1":
229             register()
230         elif aa == "2":
231             login_login()
232         elif aa == "exit":
233             exit()
234         else:
235             print("輸入錯誤!")
python2.7購物車

python3.4

  1 #!/usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3 import pickle
  4 import time
  5 #註冊
  6 def register():
  7     while True:
  8         with open("user.txt","rb") as o:
  9             dic=pickle.load(o)
 10             name=input("請輸入註冊帳號:")
 11             if name in dic.keys():
 12                 print("帳號已存在,請重新輸入!")
 13                 continue
 14             else:
 15                 pwd=input("請輸入密碼:")
 16             dic[name]=[pwd,0,0]
 17             print("註冊成功")
 18             with open("user.txt","wb") as o:
 19                 pickle.dump(dic,o)
 20             break
 21 #登錄
 22 def login_login():#驗證用戶名密碼是否正確
 23      while True:
 24         username=input("請輸入賬戶名:")
 25         with open("user.txt","rb") as o:
 26             dic=pickle.load(o)  #取出已經序列化的字典,變成可讀的字典
 27         if username in dic.keys():  #如果賬戶名存在
 28             count=dic[username][2]  #讀取字典里的輸錯次數,count為輸錯的次數
 29             while True:
 30                 if count<3:
 31                     pwd=input("請輸入密碼:")
 32                     if dic[username][0] == pwd:
 33                         print ("登錄成功!")
 34                         time.sleep(1)
 35                         loginmod(username)
 36                         break
 37                     else:
 38                         count = count+1 #錯誤一次,count加1
 39                         print ("密碼錯誤")
 40                         continue
 41                 else:
 42                     print ("帳號已被鎖定")      #輸錯3次後鎖定賬戶
 43                     dic[username][2]=3       #把該卡號的錯誤次數改為3
 44                     with open("user.txt","w") as o:
 45                         pickle.dump(dic,o)       #重新寫入文件
 46                         exit()
 47         else:
 48             print ("賬號名錯誤")
 49             continue
 50         break
 51 #購物實現
 52 def shopping(usname):
 53     buy_count=0 #購買物品的總價格
 54     buy_dic={}  #用來放已購買物品的字典
 55     buy_string=""   #用來顯示購物車信息的字元串
 56     with open("goods_1.txt","rb") as o:
 57         totallist=pickle.load(o)
 58     while True:
 59         number=[]
 60         print("%s購物車:%s"%("商品列表".ljust(65),buy_string))
 61         print("-----------------------------------"	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.性能 Py3.0運行 pystone benchmark的速度比Py2.5慢30%。Guido認為Py3.0有極大的優化空間,在字元串和整形操作上可 以取得很好的優化結果。 Py3.1性能比Py2.5慢15%,還有很大的提升空間。2.編碼 Py3.X源碼文件預設使用utf-8編碼...
  • Windows下安裝ruby先安裝ruby吧點擊安裝,額,咳咳什麼情況,好了 人是有國籍的,但知識無國界的是這個意思吧,選擇安裝語言選擇安裝目錄順便勾選上添加到環境變數吧安裝完成打開命令行,ruby -v查看下吧,安裝成功如何在Mac OS X上安裝 Ruby運行環境 對於新入門的開發者,如何安裝....
  • 轉至:http://blog.csdn.net/whycold/article/details/41119807RabbitMQ簡介 AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標準,為面向消息的中間件設計。消息中間件主要....
  • #coding:utf-8__author__ = 'similarface''''序列的排列組合'''def permute(list): ''' 序列的排列數: abc=abc,acb,bac,aca,cab,cba :param list: :return: ''...
  • 一、cookie 起源cookie 最早是網景公司的雇員 Lou Montulli 在1993年3月發明,後被 W3C 採納,目前 cookie 已經成為標準,所有的主流瀏覽器如 IE、Chrome、Firefox、Opera 等都支持。cookie 的誕生是由於 HTTP 協議的天生缺陷,HTTP...
  • 設置session用memcache來存儲方法I: 在 php.ini 中全局設置 session.save_handler = memcache session.save_path = "tcp://127.0.0.1:11211" 方法II: 某個目錄下的 .htaccess php_val.....
  • win/linux中的文件屬主獲取方法,寫了很多遍都記不住 - -, 還是記錄一下,i)win中通過apiGetNamedSecurityInfo 獲取到ower_sid, group_sid, 或者通過 getfilesecurity 獲取到文件的file_sid, 通過GetSecurityDe...
  • 一、下載jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html二、安裝JDk2.1、解壓jdk1.創建一個目錄ln0491@ln0491-virtual-machine:/$ su...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...