1. 購物系統,可以註冊登陸,用戶第一次登陸後,讓用戶輸入金額,而後打印商品列表
2. 容許用戶根據商品編號購買商品
3. 用戶選擇商品後,檢測餘額是否夠,夠就直接扣款,不夠就提醒
4. 購買完一件商品後打印購物清單及餘額
5. 可隨時查看購物清單和退出
6. 若是用戶屢次購買同一商品,必須合併商品數量和價格信息
7. 用戶下次登陸時,可查看以前的消費記錄python
1. 經過分析需求,使用面向過程和函數式編程的方式更好; 2. 文件序列化經過 pickle實現永久存儲; 3. 每一個用戶信息用獨立的數據文件來存儲; 4. 要求輸入數字的地方只能輸入正整數; 5. 第二次購買的商品若是同第一次購買的相同,則在第一次商品信息上進行疊加。
#!/usr/bin/python3 # -*- coding: utf-8 -*- # Author: hkey import os, pickle def file_oper(file, mode, *args): ''' 經過pickle序列化持久存儲數據信息 :param file: 不一樣的用戶生成不一樣的數據文件,文件名+'.db' :param mode: 對數據文件的操做,讀取仍是寫入 :param args: 須要寫入的數據信息 :return: 返回讀取數據文件的信息 ''' if mode == 'wb': data = args[0] with open(file, mode) as f: pickle.dump(data, f) elif mode == 'rb': with open(file, mode) as f: data = pickle.load(f) return data def user(user, pwd, mode): ''' 用戶註冊及登陸 :param user: 用戶輸入的用戶名 :param pwd: 用戶輸入的密碼 :param mode: 註冊仍是登陸 :return: 登陸成功,返回用戶信息;登陸失敗,返回 None ''' db_file = user + '.db' # 用戶註冊 if mode == 'regist': if not os.path.isfile(db_file): user_info = {'name': user, 'passwd': pwd, 'stat': 0} file_oper(db_file, 'wb', user_info) print('\033[32;1m註冊成功.\033[0m') else: print('\033[31;1m錯誤:該用戶已存在.\033[0m') # 用戶登陸 elif mode == 'login': if os.path.isfile(db_file): dict_user = file_oper(db_file, 'rb') if dict_user['name'] == user and dict_user['passwd'] == pwd: print('\033[32;1m登陸成功.\033[0m') return dict_user else: print('\033[31;1m錯誤:用戶名密碼錯誤。\033[0m') else: print('\033[31;1m錯誤:該用戶不存在.\033[0m') def shopping(user_dict, list_goods): ''' 用戶購物信息 :param user_dict: 用戶信息 :param list_goods: 商品列表 ''' # 判斷購物車內是否有商品 if user_dict['shopping_car']: list_shopping = user_dict['shopping_car'] else: list_shopping = [] while True: print('\033[32;1m商品列表\033[0m'.center(50, '#')) for i, k in enumerate(list_goods): print('序號:%s\t商品名:%s\t\t價格:%s' % (i, k['name'], k['price'])) choice = input('\033[34;1m購買請輸入商品序號[t 查看購物清單 q 退出]:\033[0m').strip() if not choice: continue # 用戶輸入大小寫 'q' 都是退出 if choice.upper() == 'Q': break # 購買商品必須輸入商品範圍類的數字 if choice.isdigit() and 0 <= int(choice) < len(list_goods): num = input('\033[34;1m輸入購買的數量:\033[0m').strip() if num.isdigit(): num = int(num) else: print('\033[31;1m錯誤:數量必須是正整數.\033[0m') # 獲取用戶輸入的商品信息,並生成商品字典 good = {'name': list_goods[int(choice)]['name'], 'num': num, 'total_prices': list_goods[int(choice)]['price'] * num} # 獲取用戶的餘額 money = user_dict['money'] # 用戶的餘額 - 商品的總價 res_money = money - good['total_prices'] if res_money >= 0: # 這裏目前沒有想到好的處理辦法,只能使用標記來作判斷 # 默認 flag 爲 True,由於用戶一次只能購買一件商品,若是用戶購買的是重複的商品,就將購買過的商品信息合併, # 而後將 flag 設置爲 False flag = True for i in list_shopping: if good['name'] == i['name']: i['num'] += good['num'] i['total_prices'] += good['total_prices'] flag = False # 當flag = True 說明用戶沒有購買重複的商品,添加新商品到購物清單;反之則購買了重複的商品 flag = False if flag: list_shopping.append(good) print('\033[32;1m購買成功!\033[0m\n') print('\033[32;1m購物清單\033[0m'.center(50, '#')) for i in list_shopping: print('商品名:%s\t數量:%s\t總價:%d元' % (i['name'], i['num'], i['total_prices'])) print('\033[33;1m您的餘額爲:%d元\033[0m' % res_money) print('##########################################\n') # 修改購物後的用戶餘額信息 user_dict['money'] = res_money # 修改購物清單信息 user_dict['shopping_car'] = list_shopping # 將修改後的數據寫入數據文件 file_oper(user_dict['name'] + '.db', 'wb', user_dict) else: print('\033[31;1m錯誤:商品總價爲:%d元,您的餘額爲:%d元,購物失敗.\033[0m' % (good['total_prices'], money)) elif choice.upper() == 'T': print('\033[32;1m購物清單\033[0m'.center(50, '#')) for i in list_shopping: print('商品名:%s\t數量:%s\t總價:%d元' % (i['name'], i['num'], i['total_prices'])) print('\033[33;1m您的餘額爲:%d元\033[0m' % user_dict['money']) print('##########################################\n') any = input('\033[34;1m任意鍵返回商品列表\033[0m').strip() continue else: print('\033[31;1m錯誤:輸入商品序號錯誤。\033[0m') def start(list_goods): while True: print('1. 註冊\n' '2. 登陸\n' '3. 退出') choice = input('>>>').strip() if not choice: continue if choice.isdigit() and 0 < int(choice) < 4: if choice == '1': username = input('\033[34;1m輸入用戶名:\033[0m').strip() password = input('\033[34;1m輸入密碼:\033[0m').strip() user(username, password, 'regist') elif choice == '2': username = input('\033[34;1m輸入用戶名:\033[0m').strip() password = input('\033[34;1m輸入密碼:\033[0m').strip() user_dict = user(username, password, 'login') # 當 user(username, password, 'login') 返回 None表示登陸失敗 if user_dict is None: continue # user_dict['stat'] = 0 表示用戶第一次登陸,user_dict['stat'] 非零則表示用戶屢次登陸 if user_dict['stat'] == 0: money = input('\033[34;1m首次登陸,請輸入充值金額:\033[0m').strip() if money.isdigit(): # 這裏沒法判斷小數類型 user_dict['money'] = int(money) # 第一次登陸設置成功金額後,將 stat 設置爲非零 user_dict['stat'] = 1 user_dict['shopping_car'] = [] print('\033[32;1m恭喜:充值成功!\033[0m') shopping(user_dict, list_goods) else: print('\033[31;1m錯誤:金額只能是正整數!\033[0m') # user_dict['stat'] = 0 表示用戶第一次登陸,user_dict['stat'] 非零則表示用戶屢次登陸 else: shopping(user_dict, list_goods) elif choice == '3': break else: print('\033[31;1m錯誤:序號輸入錯誤.\033[0m') if __name__ == '__main__': # 商品列表 list_goods = [ {'name': '蘋果', 'price': 10}, {'name': '鴨梨', 'price': 20}, {'name': '芒果', 'price': 30}, ] start(list_goods)
部分運行截圖:git
圖1:編程
圖2:app
圖3:ide
圖4:函數式編程