初學python:第一步 —— 編寫一個購物車程序

程序要求

一、啓動程序後,輸入用戶名密碼後,讓用戶輸入工資,而後打印商品列表
二、容許用戶根據商品編號購買商品
三、用戶選擇商品後,檢測餘額是否夠,夠就直接扣款,不夠就提醒
四、可隨時退出,退出時,打印已購買商品和餘額
五、在用戶使用過程當中,
關鍵輸出,如餘額,商品已加入購物車等消息,需高亮顯示
擴展需求:
一、用戶下一次登陸後,輸入用戶名密碼,直接回到上次的狀態,即上次消費的餘額什麼的仍是那些,再次登陸可繼續購買
二、容許查詢以前的消費記錄python

編寫思路

流程圖
圖片描述git

程序文件

Module1_homework2_cart.py
setup.pygithub

程序安裝與運行

python setup.py install

安裝命令。
生成database.json文件。用於緩存用戶的購買記錄、當前餘額、鎖定狀態。數據庫

python setup.py run

運行命令。json

程序正文

# -*- coding: utf8 -*-
import json

user_dict = {'henry': {'pass': 'henry123'},
             'tom': {'pass': 'tom123'},
             'jenry': {'pass': 'jenry123'}}
goods_lists = [
    {'name': '電腦', 'price': 1999},
    {'name': '鼠標', 'price': 10},
    {'name': '遊艇', 'price': 20},
    {'name': '美女', 'price': 998},
]
database_file = 'database.json'


def setup():
    """
    安裝函數,主要用於初始化database.json文件。無其餘用途
    """
    data = {}
    for account in user_dict:
        data[account] = {}
        data[account]['history'] = []
        data[account]['balance'] = 0
        data[account]['lock_status'] = 0
    _dump_database(data=data)


def _output_format(output):
    """輸出內容格式化。

    將輸出的內容格式化爲高亮顯示。
    :param output: 導入須要高亮顯示的輸出內容。
    :return:
        返回字符串。
    """
    return '\033[1m%s\033[0m' % output


def _load_database(filename=database_file):
    """數據庫讀取函數。

    讀取json文件。該文件存儲了用戶的購買記錄、剩餘資金、鎖定狀態。
    :param filename: 數據庫文件,默認爲database.json。
    :return:
        將database.json文件中的內容讀取後,返回字典。
        例如:
            {"henry": {"history": [], "balance": 0, "lock_status": 0},
             "tom": {"history": [], "balance": 0, "lock_status": 0},
             "jenry": {"history": [], "balance": 0, "lock_status": 0}}
    """
    with open(filename, 'r') as f:
        database = json.load(f)
    return database


def _dump_database(data, filename=database_file):
    """寫入數據庫函數。

    將數據回寫到數據庫文件中。
    :param data: 導入的數據內容。
    :param filename: 數據庫文件,默認爲database.json。
    """
    with open(filename, 'w') as f:
        json.dump(data, f)


def _set_shopping_history(account, shopping_record):
    """存儲購物記錄函數

    該函數用於將用戶的購物記錄。經過調用_dump_database()函數的方式記錄到數據庫中
    :param account: 導入登陸的用戶帳號
    :param shopping_record: 導入購物的記錄
    """
    data = _load_database()
    data[account]['history'].append(shopping_record)
    _dump_database(data=data)


def _get_shopping_history(account):
    """獲取歷史的購物記錄

    該函數調用_load_database()函數和_get_goods()函數。獲取歷史的購物記錄,並進行輸出格式化
    :param account: 導入登陸的用戶帳號
    """
    data = _load_database()[account]['history']
    _get_goods(goods=data)


def _set_balance(account, price):
    """計算餘額函數

    該函數用於
    :param account: 導入登陸的用戶帳號
    :param price: 導入商品價格
    """
    data = _load_database()
    data[account]['balance'] -= price
    _dump_database(data=data)


def _recharge_balance(account, price):
    """餘額充值函數

    :param account: 導入登陸的用戶帳號
    :param price: 導入充值價格
    """
    data = _load_database()
    data[account]['balance'] += price
    _dump_database(data=data)


def _get_balance(account):
    """獲取餘額函數

    :param account: 導入登陸的用戶帳號
    :return:
        將database.json文件中的'balance'鍵的值進行讀取,返回字符。
    """
    data = _load_database()[account]['balance']
    return data


def _set_lock_user(account, lock_id):
    """設置用戶鎖

    當用戶登陸不正確時,觸發用戶鎖定。
    :param account: 導入登陸的用戶帳號
    :param lock_id: 鎖定的狀態,0爲不鎖定,1爲鎖定
    """
    data = _load_database()
    data[account]['lock_status'] = lock_id
    _dump_database(data=data)


def _get_lock_user(account):
    """獲取用戶鎖

    檢查database.json文件中lock_status鍵的值。
    :param account: 導入登陸的用戶帳號
    :return:
        將database.json文件中的'lock_status'鍵的值進行讀取,返回類型爲字符串。
    """
    data = _load_database()[account]['lock_status']
    return data


def _get_goods(goods=goods_lists):
    """將商品列表(goods_lists)進行從新格式化

    用於展現商品列表和歷史購物記錄
    :param goods: 導入商品信息。能夠是列表和字符串。
    """

    # 若是goods參數的類型是列表,將打印出全部列表中的商品。並將輸出內容從新格式化爲:
    # --------------------商品列表--------------------
    # 商品名稱:電腦, 商品價格:1999
    # 商品名稱:鼠標, 商品價格:10
    # 商品名稱:遊艇, 商品價格:20
    # 商品名稱:美女, 商品價格:998

    if type(goods) == list:
        goods_show = ['%s商品列表%s\n' % ('-' * 20, '-' * 20)]
        for g in goods:
            goods_show.append('商品名稱:%s, 商品價格:%s\n' % (g['name'], g['price']))
        goods_table = ''.join(goods_show)
        print(goods_table)
    # 當goods參數爲其餘時,而且goods等於商品列表中某個商品的名稱。返回該商品的字典。
    else:
        for g in goods_lists:
            if goods == g.get('name'):
                return g


def _login():
    """用戶登陸函數

    :return:
        返回用戶登陸的帳號。返回類型爲字符串。
    """
    count = 3
    # 反向計數器,當計數器大於等於1並小於等於3時執行循環。不然退出循環。
    while 1 <= count <= 3:
        user = input('請輸入您的用戶名:').strip()
        passw = input('請輸入您的密碼:').strip()
        # 若是用戶名和帳號輸入空格的化從新輸入。
        if not user or not passw:
            continue
        # 每執行一次循環,計數器減1。
        count -= 1
        # 若是用戶名在user_dict的字典中,而且調用_get_lock_user()函數判斷用戶帳號的鎖定狀態是否爲1。
        # 若是兩個條件都知足的話直接打印帳號被鎖定的信息。
        if user in user_dict.keys() and _get_lock_user(account=user) == 1:
            print(_output_format(output="您的%s帳號已被鎖定,請聯繫管理員解鎖,或者使用其餘帳號。" % user))
        # 若是用戶名在user_dict的字典中,請用戶輸入密碼。
        elif user in user_dict.keys():
            # 若是密碼等於user_dict[user]字典中的'pass'鍵的值。答應歡迎登錄界面。並設置用戶鎖爲0。
            if passw == user_dict[user]['pass']:
                _set_lock_user(account=user, lock_id=0)
                print(_output_format(output="歡迎 %s 登陸!" % user))
                return user
            # 除此答應密碼錯誤,並給出3個輸入機會。若是計數器等於0。就設置用戶鎖爲1。
            else:
                print(_output_format(output='密碼錯誤。您還有%s次機會。'% count))
                if count == 0:
                    _set_lock_user(account=user, lock_id=1)
                    exit(1)
                continue
        # 當用戶用戶名輸入錯誤時,答應錯誤。並從新要求輸入。
        else:
            print(_output_format(output='用戶名錯誤'))
            continue


def _shopping_buy(account):
    """購買函數

    :param account: 導入登陸的用戶帳號
    """
    while True:
        # 展現商品信息。
        _get_goods()
        # 請用戶輸入須要購買的商品名稱
        buy_goods = input('請選擇你須要購買的商品("b"返回上一級、"q"退出):').strip()
        if not buy_goods:
            continue
        # 按'q'退出
        elif buy_goods == 'q':
            exit()
        # 按'b'返回上一層
        elif buy_goods == 'b':
            break

        else:
            g_goods = _get_goods(goods=buy_goods)
            # 判斷是否有餘額。若是餘額爲0。要求用戶充值。並返回上一層。
            if _get_balance(account=account) == 0:
                print(_output_format(output='您沒有可用的餘額,請在上級菜單進行充值!'))
                break
            # 判斷用戶輸入的商品是否在商品列表中。若是不在,讓用戶從新輸入。
            elif g_goods is None:
                print(_output_format(output='您選購的商品並未在咱們的貨架中...'))
                continue
            # 除此,獲取商品的售價、添加歷史購買記錄(調用_set_shopping_history()函數)、計算餘額(調用_set_balance()函數)、
            # 打印用戶的當前餘額。
            else:
                g_price = g_goods.get('price')
                g_balance = _get_balance(account=account)
                _set_shopping_history(account=account, shopping_record=g_goods)
                _set_balance(account=account, price=g_price)
                print(_output_format(output='您當前的餘額有%s元' % g_balance))


def _shopping_recharge(account):
    """充值函數

    :param account:導入登陸的用戶帳號
    """
    while True:
        recharge = input('請輸入你須要充值的金額("b"返回上一級、"q"退出):').strip()
        if recharge == 'q':
            exit()

        elif recharge == 'b':
            break

        else:
            if not recharge.isdigit():
                print(_output_format(output='必須輸入數值!'))
                continue
            else:
                int_recharge = int(recharge)
                _recharge_balance(account=account, price=int_recharge)
                balance = _get_balance(account=account)
                print(_output_format(output='您已完成充值!您的當前餘額爲%s' % balance))
                break


def _shopping(account):
    """購物主菜單函數。

    :param account: 導入登陸的用戶帳號
    """
    # 一級循環。用於用戶進入購買界面、查詢歷史記錄和退出登陸
    while True:
        choose = input('"r"充值、"s"購買商品、"l"查看購物記錄、"q"退出:').strip()
        if choose == 'q':
            exit(0)

        elif choose == 'l':
            _get_shopping_history(account=account)
            continue

        elif choose == 's':
            _shopping_buy(account=account)

        elif choose == 'r':
            _shopping_recharge(account=account)


def main():
    login = _login()
    _shopping(account=login)


if __name__ == '__main__':
    main()

README

README.md緩存

學習筆記

待補充app

相關文章
相關標籤/搜索