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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...