python第七天-作業[購物車]

来源:http://www.cnblogs.com/uge3/archive/2017/05/09/6833032.html
-Advertisement-
Play Games

作業要示: 購物車程式:啟動程式後,輸入用戶名密碼後,如果是第一次登錄,讓用戶輸入工資,然後列印商品列表允許用戶根據商品編號購買商品用戶選擇商品後,檢測餘額是否夠,夠就直接扣款,不夠就提醒 可隨時退出,退出時,列印已購買商品和餘額在用戶使用過程中, 關鍵輸出,如餘額,商品已加入購物車等消息,需高亮顯 ...


作業要示:

購物車程式:
啟動程式後,輸入用戶名密碼後,如果是第一次登錄,讓用戶輸入工資,然後列印商品列表
允許用戶根據商品編號購買商品
用戶選擇商品後,檢測餘額是否夠,夠就直接扣款,不夠就提醒
可隨時退出,退出時,列印已購買商品和餘額
在用戶使用過程中, 關鍵輸出,如餘額,商品已加入購物車等消息,需高亮顯示
用戶下一次登錄後,輸入用戶名密碼,直接回到上次的狀態,即上次消費的餘額什麼的還是那些,再次登錄可繼續購買
允許查詢之前的消費記錄

先上一下流程吧!

具體代碼還在優化中》》》先一下與流程圖對應的代碼吧!

  1 #!usr/bin/env python
  2 #-*-coding:utf-8-*-
  3 # Author calmyan
  4 import time,sys,os
  5 with open('user_file.txt','r',encoding='utf-8') as user_file:
  6     user_list=eval(user_file.readline())#轉換用戶文件中的字元串
  7 lock_name=open('lock_name.txt','r+',encoding='utf-8')#打開鎖定用戶列表文件
  8 lock_list=eval(lock_name.readline())#轉換鎖定用戶文件中的字元串
  9 
 10 def userchar(_user_name):#檢測用戶名的函數
 11     while True:
 12         if _user_name in user_list and _user_name not in lock_list:#判斷用戶是否存在並正常
 13             return True#存在返回真
 14             break
 15         elif _user_name in user_list and _user_name  in lock_list:#判斷用戶是否被鎖定
 16             print('您的用戶已經被鎖定,請聯繫商家解鎖!')
 17             break
 18         else:
 19             print('您輸入用戶不存在,請先註冊')
 20             break
 21 
 22 def confirm():#退出確認函數
 23     qu=input("是否退出登陸!按\033[31;1mY/y\033[0m退出? 按其它鍵重新登陸:")
 24     if qu=='Y'or qu=='y':
 25         print("您已經退出!" )
 26         exit()#退出程式
 27     else :
 28         pass
 29 
 30 def user_pass():
 31     bool=True#定義退出迴圈條件變數
 32     while bool:
 33         _user_name=(input('請輸入用戶名:'))
 34         if userchar(_user_name.strip()):#運行檢測用戶名的函數判斷,去除兩邊空格
 35             count=3#定義鎖次數
 36             while count>0 :#如果密碼錯誤次數超過退出密碼輸入
 37                 #password=getpass.getpass('請輸入密碼:')
 38                 password=input('請輸入密碼:')
 39                 if password==user_list[_user_name]:#密碼通過驗證結束迴圈
 40                     print("密碼通過驗證")
 41                     bool=False
 42                     print("歡迎您  \033[32;1m%s\033[0m  您已經登陸成功!" % _user_name)
 43                     return _user_name#返回用戶名
 44                 else:
 45                     count -=1#次數減少
 46                     print("密碼錯誤請重試,剩餘:\033[31;1m%s\033[0m次! "% count)
 47                     pass
 48             else:
 49                 print("\033[31;1m超出所試次數,賬戶已鎖定!請聯繫商家!\033[0m")
 50                 lock_list.append(_user_name)#將用戶名加出鎖定列表
 51                 lock_name.seek(0)#指針移動到開頭,以免產生多個元組
 52                 lock_name.write(str(lock_list))#寫入鎖定用戶文件
 53                 lock_name.tell()#獲取當前指針,以免產生多個元組
 54                 lock_name.close()#關閉鎖定用戶文件
 55                 confirm()#退出確認函數
 56                 #continue#退回到輸入用戶名的位置
 57         else:#如果用戶名出錯新來過
 58             confirm()
 59             pass
 60 
 61 def infor():#打開用戶信息函數
 62     with open('user_infor','r+',encoding='utf-8') as user_infor:#打開用戶購物信息文件
 63         infor_list=eval(user_infor.readline())#轉換文件的字元串
 64         return infor_list
 65 
 66 #程式開始:
 67 if os.path.exists('history'):#確認文件是否存在
 68     pass
 69 else:
 70     with open('history','w',encoding='utf-8') as user_history:#創建一個用戶帳戶購物記錄文件
 71         user_history.write('{}')#寫入空值
 72     pass
 73 
 74 if os.path.exists('user_infor'):#確認文件是否存在
 75     pass
 76 else:
 77     with open('user_infor','w',encoding='utf-8') as user_infor:#創建一個用戶帳戶信息記錄文件
 78         user_infor.write('{}')#寫入空值
 79     pass
 80 
 81 print("歡迎來到\033[31;1mpython\033[0m購物商城!")
 82 time_format='%y-%m-%d %X'#定義時間格式
 83 times=time.strftime(time_format)#定義時間
 84 _user_name= user_pass()#將通過驗證的用戶名賦於變數
 85 
 86 if _user_name in infor():#如果用戶信息存在記錄就跳過
 87     pass
 88 else:
 89     while True:
 90         name_char=input("首次登陸,請輸入工資(購物資金):")#用戶輸入工資(購物資金)
 91         if  name_char.isdigit():#檢測輸入是否為整數
 92             name_char=int(name_char)#轉為int
 93             with open('history','r+',encoding='utf-8') as user_history:#打開用戶帳戶購物記錄文件
 94                 history_list=eval(user_history.readline())#將文本讀為字典
 95                 history_list[_user_name]={}#創建用戶購物記錄
 96                 user_history.seek(0)#移到開頭
 97                 user_history.write(str(history_list))#寫入文件
 98             with open('user_infor','r+',encoding='utf-8') as user_infor:
 99                 infor_list=eval(user_infor.readline())#轉換首登用戶文件中的字元串
100                 infor_list[_user_name]={"金額":name_char}
101                 user_infor.seek(0)
102                 user_infor.write(str(infor_list))#寫入用戶信息
103             break
104         else:
105             print('金額不能為0或負數請正確輸入金額!')
106             continue
107 #再次登陸直接顯示用戶信息
108 infor_list=infor()#獲取用戶信息字典
109 name_char=int(infor_list[_user_name]['金額'])#獲取餘額
110 with open('history','r',encoding="utf-8") as user_history:#讀取用戶文件
111     history_list=eval(user_history.readline())#用戶購物信息
112 shoplist=[]#購物車列表
113 shop_count=0#購物金額統計
114 ###進入商品列表###
115 goodsname=[]#定義商品列表
116 print('用戶名:\033[32;1m%s\033[0m:'%_user_name)#輸出用戶信息
117 print('您的餘額:\033[31;1m%s\033[0m:'%name_char)
118 history=history_list[_user_name]#用戶購物記錄信息
119 print('您的購物記錄如下:')
120 for k,v in history.items():#轉為列表進行輸出
121     print(k,v)#輸出購物記錄
122 print('載入商品列表:')
123 #載入動態
124 for i in range(40):
125     sys.stdout.write('#')
126     sys.stdout.flush()
127     time.sleep(0.05)
128 print('\n')
129 
130 
131 with open('goodslist.txt','r',encoding='utf-8') as f:#打開商品列表文件
132     for line in f:
133         a=line.find(',')#定位分割符的索引進行分割
134         goodsname.append((line[0:a],int(line[a+1:])))#元組模式追加到列表,價格轉為整數
135 
136 while True:
137     for index,p_item in enumerate(goodsname):#取出下標輸出 商品列表
138         print(index,p_item)#輸出商品列表
139     user_index=input('請輸入商品編號添加你所在購買的商品,按用\033[31;1mq/Q\033[0m退出>>>:')
140     if user_index.isdigit():#判斷是否為整數
141         user_index=int(user_index)#轉為數字
142         if user_index < len(goodsname) and user_index>=0:#判斷所選商品編號在在列表
143             p_item=goodsname[user_index]#讀取下標所在(元素)商品
144             if p_item[1]<=name_char:#餘額是否足夠
145                 shoplist.append(p_item)#添加到購物車
146                 name_char-=p_item[1]#扣除金額
147                 shop_count+=p_item[1]#累加購物金額
148                 print("添加 \033[32;1m%s\033[0m 到購物車,價格: \033[32;1m%s\033[0m 元"% p_item)
149                 print("你的購物金額餘 \033[31;1m%s\033[0m 元"% name_char)
150             else:
151                 print("你的購物金額餘 \033[41;1m%s\033[0m 元,無法購買該商品!" % name_char)
152         else:
153              print('輸入錯誤,該編號 \033[41;1m%s\033[0m 的商品不存在!'%user_index)
154     elif user_index=='q'or user_index=='Q':
155         print('你的購物清單:')
156         for up in shoplist:#列印購物清單
157             print(up)
158         print("你的購物總金額為:\033[32;1m%s\033[0m 元!"% shop_count)
159         print("你的購物金額餘: \033[31;1m%s\033[0m 元!" % name_char)
160         while True:
161             confirm=input("你是否確定退出購物?\033[31;1m Y/y \033[0m 是 \033[31;1mN/n\033[0m 否:")
162             if confirm== 'Y'or confirm== 'y' :
163                 infor_list[_user_name]['金額']=name_char#修改用戶金額(購物後)
164                 shoplist.append(('總額:',shop_count))#列表加入總額
165                 history_list[_user_name][times+'購物清單:']=shoplist#添加時間:清單
166                 with open('user_infor','w',encoding="utf-8") as user_infor:#寫入文件用戶信息
167                     user_infor.seek(0)#移到最前
168                     user_infor.write(str(user_list))#寫入
169                 with open('history','r+',encoding='utf-8') as user_history:#購物信息寫入文件
170                     user_history.seek(0)#移到最前
171                     user_history.write(str(history_list))#寫入
172                 exit(print("謝謝!歡迎您再次光臨!"))
173             elif confirm=='N'or confirm== 'n' :
174                 break
175             else:
176                 print("輸入錯誤!請按提示輸入!")
177                 continue
178     else:
179         print('\033[41;1m輸入商品編號錯誤,請重新輸入!\033[0m')

還著一點點,擼了一天的代碼了!!還想要更好!!

 

完美 主義,傷不起來!!

 


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

-Advertisement-
Play Games
更多相關文章
  • 查看原文 本文我們來學習 Code first 在初始化資料庫時是如何決定資料庫名稱和伺服器的。 下圖展示了資料庫初始化的工作流。 由圖可知,上下文類的基本構造函數的參數可以有以下幾種方式: 1、沒有參數 2、有資料庫名 3、有連接字元串名 一、沒有參數(No Parameter) 如果上下文類的基 ...
  • 總目錄 插件目錄結構(一) Admin後臺頁面編寫(二) 前臺模板頁編寫(三) URL重寫(四) 本實例旨在以一個實際的項目中的例子來介紹如何在dtcms中製作插件,本系列文章非入門教程,部分邏輯實現一帶而過,敬請諒解。 時隔2年,再次收到本文的回覆,實在慚愧,本系列竟然終止於第二章節。不從外部找原... ...
  • 模塊:用一堆代碼實現了某個功能的代碼集合,模塊是不帶 .py 擴展的另外一個 Python 文件的文件名。 一、time & datetime模塊 二、random模塊 三、OS模塊 四、sys模塊 五、shutil模塊 六、XML處理模塊 七、configparser模塊 用於生成和修改常見配置文 ...
  • 03 樹1:樹的同構 Description: 給定兩棵樹T1和T2。如果T1可以通過若幹次左右孩子互換就變成T2,則我們稱兩棵樹是“同構”的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點A、B、G的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。現給定兩棵樹,請你判斷它們是否是 ...
  • 前面有用 tomcat-redis-session-manager來實現分散式session管理,但是它有一定的局限性,主要是跟tomcat綁定太緊了,這裡改成用Spring Session來管理分散式session,Spring Session就完全實現了與具體的容器無關,如果需要瞭解如何用tom ...
  • 1、使用ext_skel工具生成擴展框架 ./ext_skel --extname=myext 2、編輯config.m4文件 cd myext/vim config.m4 3、php化並配置phpize5 ./configure --with-php-config=/usr/bin/php-con ...
  • IO流(輸入流、輸出流),又分為位元組流、字元流。 流是磁碟或其它外圍設備中存儲的數據的源點或終點。 輸入流:程式從輸入流讀取數據源。數據源包括外界(鍵盤、文件、網路…),即是將數據源讀入到程式的通信通道。 輸出流:程式向輸出流寫入數據。將程式中的數據輸出到外界(顯示器、印表機、文件、網路…)的通信通 ...
  • 一、基本概念 volatile作為Java虛擬機提供的最輕量級同步機制,用於保證共用變數在多線程的情況下各線程獲取相同,不出現對該變數的操作和其他記憶體操作一樣重排序。 重排序 在虛擬機上,由於記憶體操作速度遠小於CPU的操作速度,為了減少CPU在等待記憶體操作過程的時間,虛擬機會按照一定規則打亂指令的執 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...