python基礎day2作業:購物車

来源:http://www.cnblogs.com/alan-babyblog/archive/2016/01/26/5161883.html
-Advertisement-
Play Games

#功能:1.可註冊賬號2.登錄買家賬號3.可查詢編輯購物車裡商品4.可以餘額充值5.可提示餘額不足6.購物車結算#使用:1.第一次使用先註冊賬號填寫賬號金額2.賬號金額信息保存在buyer_account.txt (預設為空)3.只針對帳號文件里的用戶進行判斷並鎖定,針對用戶和密碼各有三次錯誤重試機...


#功能:
1.可註冊賬號
2.登錄買家賬號
3.可查詢編輯購物車裡商品
4.可以餘額充值
5.可提示餘額不足
6.購物車結算

#使用:
1.第一次使用先註冊賬號填寫賬號金額
2.賬號金額信息保存在buyer_account.txt (預設為空)
3.只針對帳號文件里的用戶進行判斷並鎖定,針對用戶和密碼各有三次錯誤重試機會。

 

 

流程圖:

 

代碼:

#!/usr/bin/env python3

#antuor:Alan

from prettytable import PrettyTable
import sys,os
import getpass,time

#用戶註冊函數#
def register():
    new_username = input('請輸入註冊用戶名:')
    new_password = input('請輸入新用戶密碼:')
    bank_money = 0

    while True:
        new_password_again = input('請再次確認新用戶密碼:')    ###再次確認密碼
        if new_password_again != new_password:                    ###密碼錯誤則迴圈
            continue
        else:
            break                                         ###正確則跳出迴圈執行下一個迴圈
    while True:
        bank_money = input('請輸入你要充值的金額:')          ###輸入金額數字
        if bank_money.isdigit():                         ###判斷金額是否為數字
            bank_money = int(bank_money)                  ###金額數字整數化
            break
        else:                                             ###如果金額非數字則不斷迴圈
            print('請輸入正確的金額')

    user_account = "%s %s %d" % (new_username,new_password,bank_money)
    # file = open('login_account.txt','a+')
    # save_file = file.write(user_account)
    # file.close()

    # print (("++++++++++恭喜你註冊成功:%s++++++++++++") % (user_account))

    with open('login_account.txt','a+') as file:          ###把用戶信息存入文檔,a+為讀寫追加模式
        file.write(user_account+'\n')                     ###寫入並換行
    print (("==============恭喜你註冊成功:%s==============") % (user_account))
    print("================請重新登錄你的賬號======================")
############################################################################

def digit_input(s):
    if str.isdigit(s):                                                     #對輸入是否是數字進行判斷
        s = int(s)                                                         #如果輸出的是個數字,則轉化為整數類型
    return s                                                               #返回輸入字元

#用戶信息函數#
def shopping_func(user='',init_money='',now_money='',recharge_money='',value=''):
    os.system('clear')                                                     #清屏###
    init_money = int(init_money)                                           #初始總金額數字化
    now_money= int(now_money)                                              #當前餘額數字化
    recharge_money = int(recharge_money)                                   #充值金額數字化


###########################通過prettytable模塊將輸出內容如表格方式整齊#########
    product_page = PrettyTable(['用戶名','金額','當前餘額','充值餘額','購物車'])
    product_page.align['用戶名'] = '1'                                      #對齊
    product_page.add_row([user,init_money,now_money,recharge_money,value])
    print(product_page)



#商品頁面展示函數#
def products_page(my_dict):

    items_dict = {}                                                        #定義函數內部字典
    ############對商品列表進行遍歷並加上數字編號###########################
    i = 1
    print('商品列表 : ')
    print(30*'===')
    print('%-5s \t %-20s     \t%s  \t%-10s    \t %s' % ('編號','商品名稱','商品價格(元)','商品總數量(個)','商品剩餘數量(個)'))
    for k in my_dict:
        v = my_dict[k]
        if type(v) is dict:
            print('%-5d  %-30s  %-10d  %-10d  %-40d' % (i,k,v['price'],v['sum'],v['num']))
            items_dict[i] = [k,v['price'],v['num'],v['sum']]               #將商品列表賦值到items_dict
        i += 1
    print(30*'===')

    return items_dict                                                      #返回格式化後的字典

########################顯示購物車商品列表函數#############################
def shopping_cart(show_dict):
    show_all_sum = 0                                                       #初始化購物車商品總價
    show_all_num = 0                                                       #初始化購物車商品數量
    ############對商品列表進行遍歷並加上數字編號###########################
    print('%s ,%s ,%-10s,%s,%s,%s' % ('編號','商品名稱','商品價格(元)','商品總數量(個)','購買數量(個)','購買金額(元)'))
    for k in show_dict:
        v = show_dict[k]
        if type(v) is list:
            print('%-5s \t %-20s \t %-10d \t %-10d \t %-10d \t %-10d' % (k,v[0],v[1],v[2],v[3],v[4]))
            show_all_sum += v[4]                                           #商品總價累計
            show_all_num += 1                                              #商品個數累計
    print('請確認您購買商品,總金額:%d(元)'.center(84,'#') % show_all_sum)
    return (show_all_sum,show_all_num)                                     #返回商品總價和商品個數

#編輯購物車商品函數#
def shopping_cart_edit(modify_dict,modify_goods_dict):

    a_flag = 1                                                             #初始化第一層編號迴圈標記
    while a_flag:
        index = input('請輸入商品編號 | 完成修改(q) : ')
        if len(index) != 0:                                                #商品編號不為空進行字元轉化
            index = digit_input(index)                                    #調用函數(自建)
        if index == 'q':                                                   #輸入為q,即完成修改退出
            break
        elif index in modify_dict:                                         #輸入為正確編號###
            b_flag = 1                                                     #初始化第二層數量迴圈標記
            name = modify_dict[index][0]                                   #對name賦值商品名稱
            while b_flag:
                num = input('請輸入新的商品數量(最大值為%d) |  完成修改(q) : ' % modify_dict[index][2] )
                if len(num) != 0:                                          #商品數量不為空進行字元轉化###
                    num = digit_input(num)
                if num == 'q':                                             #輸入為q,即完成修改退出###
                    break
                elif num == 0:                                             #輸入為0,即刪除字典中的這個條目
                    modify_goods_dict[name]['num'] = modify_dict[index][2] #商品列表中的商品數量變為初始值
                    del modify_dict[index]                                 #購物車刪除這個商品
                    b_flag = 0
                elif num > 0 and num <= modify_dict[index][2]:             #輸入為要求數字,則進行數量和金額修改
                    modify_dict[index][3] = num
                    modify_dict[index][4] = modify_dict[index][1] * num
                    modify_goods_dict[name]['num'] = modify_dict[index][2] - num    #更新商品列表中的商品數量
                    b_flag = 0
                else:
                    pass
        else:
            pass
    return (modify_dict,modify_goods_dict)                                 ###返回修改後的購物車商品列表###


#購物車展示函數#
def shopping_cart_show(my_cart,my_goods_dict):

    print('歡迎來到您的購物車'.center(80,'#'))
    goods_all_sum = 0                                                      ###初始化購物車商品總金額###
    goods_all_num = 0                                                      ###初始化購物車商品總數量###

    if my_cart:                                                            ###購物車參數不為空###
        ###########調用購物車商品列表函數,並返回商品總金額和總數量#########
        (goods_all_sum,goods_all_num)  = shopping_cart(my_cart)

        choice = input('請進行如下操作 : 修改記錄(c) | 繼續購物(!c)')
        if choice == 'c':                                                  ###對購物車商品列表進行修改###
            (my_shop_cart,my_goods_dict) = shopping_cart_edit(my_cart,my_goods_dict)  ###調用商品修改函數,並返回新的商品列表###
            (goods_all_sum,goods_all_num) = shopping_cart(my_shop_cart)  ###購物車商品展示,並返回最新的商品總價###
        else:
            pass
    else:
        print('當前您的購物車為空'.center(80,' '))

    time.sleep(2)
    return (goods_all_sum,goods_all_num,my_goods_dict)                      #購物車中商品總價、數量和用戶商品列表#


#餘額充值函#
def balance_recharge(recharge_init_balance,recharge_now_balance,recharge_money):
    recharge_flag = 1                                                       #充值迴圈參數初始化###
    while recharge_flag:
        recharge_num = input('請輸入充值金額 | 返回(b) | 退出(q):')
        if len(recharge_num) != 0:                                          #如果輸入非空,對輸入進行判斷並轉化類型
            recharge_num = digit_input(recharge_num)
        if recharge_num == 'q':                                             #如果輸入為q,則退出程式
            sys.exit(0)
        elif recharge_num == 'b':                                           #如果輸入為b,則返回第一層迴圈,重新選擇商品編號
            break
        elif type(recharge_num) is int and recharge_num > 0 :               #輸入要求充值金額
            recharge_init_balance += recharge_num                           #初始金額增加
            recharge_now_balance += recharge_num                            #當前餘額增加
            recharge_money += recharge_num                                  #充值金額增加
            recharge_flag = 0                                               #改變充值迴圈參數
            print('充值成功,請查收'.center(80,' '))                          #提示充值成功
        else:
            pass
    return (recharge_init_balance,recharge_now_balance,recharge_money)      #返回初始、當前、充值金額


#用戶結帳函數#
def pending_order(billing_list,my_cart,billing_balance):

    print('歡迎來到結算菜單'.center(80,'#'))
    if my_cart:                                                             #購物車參數不為空
        #############調用購物車商品列表函數################################
        shopping_cart(my_cart)
        billing_flag = input('請確認是否商品結算(y | n):')
        if billing_flag == 'y':                                             #商品結算確認
            billing_file = open('buyer_account','w')                             #打開讀寫帳號文件
            for user_info in billing_list:
                billing_file.writelines(user_info)                          #回寫用戶列表信息
            billing_file.close()                                            #關閉帳號文件
            sys.exit('結帳成功,你當前餘額 :%d'.center(80,' ') % billing_balance)
        else:
            print('退出結算菜單,繼續購物'.center(80,' '))
            time.sleep(2)
    else:
        print('當前您的購物車為空,無需結算'.center(80,' '))
        time.sleep(2)



################################主程式開始##################################

################################商品列表####################################

goods_list = {
             'iphone6s': {'price':6000,'num':10,'sum':10},     #num為當前庫存,sum為商品總數量
             'ipad pro': {'price':3000,'num':20,'sum':20},
             'Bike': {'price':2000,'num':15,'sum':15},
             'DLS Camera': {'price':1999,'num':8,'sum':8},
             'macbook pro': {'price':14000,'num':5,'sum':5},
             'macbook air': {'price':7000,'num':10,'sum':10},
             'Fountain Pen':{'price':15,'num':50,'sum':50},

}


######用戶註冊,寫入login_account.txt文件里######################



ask_question = input('是否已經有賬號? y|n:')                                 ###是否有賬號,是則登錄,不是則註冊

while True:

    if ask_question == 'y':
        break
    else:
        register()                                                         ###調用登錄函數
        break



##############################################################
i = 0
while i < 3:                                                                ###只要用戶登錄異常不超過3次就不斷迴圈###
    username = input('請輸入用戶名:')                                      ###輸入用戶名###
    password = input('請輸入密碼:')                                        ###輸入隱藏密碼###
    user_file = open('login_account.txt','r')                              ###打開帳號文件###
    #next(user_file)
    user_list = user_file.readlines()                                     ###用戶列表信息###
    user_file.close()                                                     ###關閉帳號文件###


    for user_line in user_list:                                        #對帳號文件進行遍歷,因為只有三個用戶,所以只讀前3行
        ######################分別獲取帳號、密碼信息和當前餘額##############
        (user,passwd,init_balance) = user_line.strip('\n').split()
        init_balance = int(init_balance)                                    ###對總金額進行數字化###
        now_balance = init_balance                                          ###對當前餘額進行數字化###
        my_goods_sum = 0                                                    ###初始化購買商品總金額###


        if username == user and password == passwd:                         ###如用戶名和密碼正常匹配###
            user_shopping_cart = {}                                         ###初始化用戶購物車字典###
            user_shopping_cart_count = 0                                    ###初始化用戶購物車內商品的數量###
            recharge_value = 0                                              ###初始化充值金額###
            line_num = user_list.index(user_line)                           ###賦值匹配用戶的下標###
            first_flag = 1                                                  ###定義第一層迴圈變數參數###

            while first_flag:

                ########################調用框架函數輸出用戶信息############
                shopping_func(username,init_balance,now_balance,recharge_value,user_shopping_cart_count)

                goods_output_dict = products_page(goods_list)             ###調用商品列表展示函數輸出商品信息###
                goods_index = input('請選擇菜單 :輸入商品編號 | 購物車(c) | 餘額充值(r) | 結帳(b) | 退出(q) : ')

                if len(goods_index) != 0:                                   ###如果輸入非空,對輸入進行判斷並轉化類型###
                    goods_index = digit_input(goods_index)

                if goods_index == 'q':                                      ###如果輸入為q,則退出程式###
                    sys.exit(0)

                elif goods_index == 'c':                                    ###如果輸入為c,則展示購物車###
                    ###調用購物車顯示函數,並返回購物車商品總金額###########
                    (my_goods_sum,user_shopping_cart_count,goods_list) = shopping_cart_show(user_shopping_cart,goods_list)
                    now_balance = init_balance - my_goods_sum               ###計算出當前餘額###
                    if now_balance < 0:
                        print('您的餘額不足,請及時充值,謝謝')
                        time.sleep(2)

                elif goods_index == 'r':                                    ###如果輸入為r,則進行餘額充值###
                    (init_balance,now_balance,recharge_value) = balance_recharge(init_balance,now_balance,recharge_value)

                elif goods_index == 'b':                                    ###如果輸入為b,則進入結賬菜單###
                    ##############更新用戶文件中用戶的餘額##################
                    user_list[line_num] = user + ' ' + passwd + ' ' + repr(now_balance) + '\n'
                    pending_order(user_list,user_shopping_cart,now_balance)  ###調用結算函數###

                elif goods_index in goods_output_dict:                      ###輸入編號為正確的商品編號###

                    ###############################取出goods_index商品列表信息併進行賦值和展示############
                    (goods_name,goods_price,goods_num) = (goods_output_dict[goods_index][0], goods_output_dict[goods_index][1], goods_output_dict[goods_index][2])
                    print('【 編號:%-5d \t 名稱:%-15s \t 價格:%-5d(元) \t 數量:%-5d(個)】' % (goods_index,goods_name,goods_price,goods_num))

                    second_flag = 1                                         ###定義第二層迴圈變數參數###
                    while second_flag:
                        buy_num = input('請輸入購買商品個數(最大值為%d) | 返回(b) | 退出(q): ' % goods_num)
                        if len(buy_num) != 0:                               ###如果輸入非空,對輸入進行判斷並轉化類型###
                            buy_num = digit_input(buy_num)
                        if buy_num == 'q':                                  ###如果輸入為q,則退出程式###
                            sys.exit(0)
                        elif buy_num == 'b':                                ###如果輸入為b,則返回第一層迴圈,重新選擇商品編號###
                            break
                        elif type(buy_num) is int and buy_num > 0 and buy_num <= goods_num:          ###輸入要求商品數量###
                            my_goods_sum = goods_price * buy_num            ###計算購買商品的總金額###
                            if my_goods_sum <= now_balance:
                                print('購買商品 %s 總價格為 : %d' % (goods_name,my_goods_sum))
                                add_flag = input('請確認是否加入購物車(y | n):')
                                if add_flag == 'y':                         ###購買商品確認加入購物車###

                                    ###判斷購物車不存在該商品###############
                                    if goods_index not in user_shopping_cart:
                                        user_shopping_cart_count += 1       ###購物車裡商品數量加1###
                                        ####將該商品加入用戶購物車字典中####
                                        user_shopping_cart[goods_index] = [goods_name,goods_price,goods_num,buy_num,my_goods_sum]
                                    ####購物車已經存在該商品,則進行數量和金額累計計算############
                                    else:
                                        user_shopping_cart[goods_index][3] += buy_num
                                        user_shopping_cart[goods_index][4] += my_goods_sum

                                    now_balance -= my_goods_sum             ###計算出當前餘額###

                                    goods_list[goods_name]['num'] -= buy_num   ###商品列表的商品數量更新###
                                    second_flag = 0                         ###設置第二層迴圈值為0,結束第二層迴圈####

                                else:
                                    break
                            else:
                                print('您的餘額不足,請充值或重新選擇,謝謝')
                                time.sleep(2)
                        else:
                            pass
                else:
                    pass
    else:
        if i != 2:                                                         ###i=2時,最後一次機會,不在提示還剩餘0次機會了##
            print('用戶或密碼錯誤,請重新輸入,還有 %d 次機會' % (2 - i))
    i += 1                                                                 ###當用戶輸入錯誤時,迴圈值增加1###
else:
    sys.exit('用戶或密碼輸入錯誤超過三次,退出系統,歡迎下次光臨')          #三次錯誤後,異常退出###

 

 


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

-Advertisement-
Play Games
更多相關文章
  • #!/usr/bin/python# -*- coding: utf-8 -*-import sysimport osimport shutildir = "/mnt/Packages"class Packages: def __init__(self,srcdir,desdir): ...
  • /********************************************************************* 函數名稱:encrypt 函數作用:加密解密字元串 使用方法: 加密 :encrypt('str','E','nowamagi...
  • 數組的概念與指針的概念聯繫非常解密。其實數組的標識相當於它的第一個元素的地址,如:int a[5],數組名a指向它的第一個元素a[0]的地址。有語句如下:int a[5];int * p;下麵的賦值為合法的:p = a;這裡指針p 和a 是等價的,它們有相同的屬性,唯一的不同是我們可以給指針p賦其它...
  • 1234567891011121314151617181920212223242526package com.lk.C;import java.net.MalformedURLException;import java.net.URL;import java.util.HashSet;import ...
  • 題目: 一個機器人位於 m x n 網格的右上角. 機器人只能向右或者向下. 機器人試圖到達右下角. 問有多少種不重覆的路徑?上圖是一個 3 x 7 的網格. m 和 n 最大為 100.鏈接: https://leetcode.com/problems/unique paths/ 方法一: 自上....
  • 獲取【下載地址】 QQ: 313596790 【免費支持更新】A 代碼生成器(開發利器); 增刪改查的處理類,service層,mybatis的xml,SQL( mysql 和oracle)腳本, jsp頁面 都生成 就不用寫搬磚的代碼了,生成的放到項目里,可以直接運行B 阿裡巴巴資料庫連接池dr....
  • 第一步 排除文件打開方式錯誤:r只讀,r+讀寫,不創建 ###f.readline()是讀取第一行,f.readlines()是讀取全部並返回一個列表w新建只寫,w+新建讀寫,會將文件內容清零(以w方式打開,不能讀出。w+可讀寫)**w+與r+區別:r+:可讀可寫,若文件不存在,報錯;w+: 可.....
  • 頭文件及庫搜索路徑頭文件的搜索路徑:頭文件的搜索規則是:找到就使用,停止繼續往下尋找1: #include “mytest.h”搜索的順序為: (1)先搜索當前目錄 (2)然後搜索編譯時 -I 指定的目錄 (3)在搜索gcc的環境變數CPLUS_INCLUDE_PATH (4)最後搜索gc...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...