好久没写博文了,看了下距离before篇的时间确实有点长,真是感觉时间越来越不够用了…… 好了不扯了,进入主题:

   先交代一下,此程序纯粹是为了练习Python各种元素的用法而假想出来的,距离现在已有段时间,此时笔者只是简单的掌握了列表、字典、模块(sys、os、pickle)文件读写等基本语法。


功能模型思路:

   1、钱、没钱怎么买东西…… 所以每次购物需要带钱(现金+信用卡)

   2、既然是购物程序那么要有商品列表和价格的对照表以便用户购买,用户不能买超出自己支付能力的商品,购买商品成功应当加入用户的购物列表,并且实时的显示用户的余额,购物刷卡没有手续费。

   3、当用户现金不够时可以用信用卡支付,信用卡付款金额 = 商品价格 - 现金(身上的钱)

   4、信用卡可以提现金,但是有手续费。

   5、应当提供还款接口。

   6、可以查看信用卡的明细,比如说什么时间买过什么东西,花了多少钱等……

   7、退出


逻辑模型思路:

   1、购物

       print 购物列表,任意用户可以光临,money为用户的所有钱,quit为退换主菜单,如果现钱不够可以刷卡

   2、提现

       10%的利息

   3、还钱

   4、查看账单(函数和Pickle)

       最大额度 = 15000

       可用额的 = 11000   (购买商品不能大于此额度)

       亏欠金额 = 4000   (此金额不能大于15000)

       ######################################

       DATE    EVENT    DATA     INTEREST

        1      car      20000       0

        2      还款    -20000       0

        3      提现     1000       100

   5、退出


代码如下:

#!/usr/bin/env python
#Author: Created by soulboy
#Function: Shopping with a credit card
import sys
import os
import pickle
salary = int(raw_input("Inpuet your salary:").strip()) #初始化每次购物的现金
def dump():                            #把pickle.dump方法定义为函数方便调用
    output = file('data.pkl','wb')
    pickle.dump(maxoverdraft,output) #信用卡最大透支额度
    pickle.dump(available,output)    #可用额度
    pickle.dump(overdraft,output)    #亏欠额度
    pickle.dump(bill,output)         #用bill字典来保存以日期为Key保存信用卡的明细
    output.close()
f = str(os.path.isfile('data.pkl'))      #定义pickle的文件data,用来保存序列化数据对象
if 'False' in f:             #如果程序是首次运行,会初始化如下对象并保存至当前目录data.pkl文件中
    maxoverdraft = 15000
    available = 15000
    overdraft = 0
    bill = {}
    dump()
def load():             #从data.pkl文件中按顺序读取序列化数据对象并重新赋值
    global maxoverdraft     #声明全局变量方便在局部变量在函数外调用
    global available
    global overdraft
    global bill
    pkl_file = file('data.pkl','rb')
    maxoverdraft = pickle.load(pkl_file)
    available = pickle.load(pkl_file)
    overdraft = pickle.load(pkl_file)
    bill = pickle.load(pkl_file)
    pkl_file.close()
def information():          #定义信息方便各功能模块重复调用
    print '''
maxoverdraft = %s $         #最大透支额度
available = %s $            #可用额度
overdraft = %s $''' %(maxoverdraft,available,overdraft) #亏欠额度
def welcome():              #主菜单函数
    print '''[1]:Go shopping !
[2]:Withdraw money !
[3]:Repayment !
[4]:Credit card list !
[5]:Exit !
            '''
def authentication():           #密码认证函数,本程序中信用卡号为:soulboy,密码为:soulboy
    while True:
        count = 0
        account = raw_input("Please input your username:")
        if account == 'soulboy':
            password = raw_input("Please input your password:")
            if password == 'soulboy':break
            while password != 'soulboy':    #实时显示剩余密码重试次数
                count += 1
                chance = 3 - count
                password = raw_input("Error password and try again,you have %s chance:"%(chance))
                if count == 3:break
            if count == 3:continue
            else:break
        else:
            print "Sorry, the %s is not exist and please check yourself:" % account
while True:
    welcome()
    print "Your Salary: %s $" % salary
    option = raw_input("Based on the digital option:").strip()
    if option == '1':
        shoplist = []
        while True:
            products = ['house','car','phone','computer','clothes']  #商品列表中的元素依次与价格列表中的元素一一对应
            pirce = [600000,200000,4000,8000,200]
            print "########################## The list of goods ##########################"
            for p in products:
                print "%s \t %s" %(p,pirce[products.index(p)])   #通过商品列表的坐标取出商品对应的价格
            choice = raw_input("please choice by it's name:")
            result = products.count(choice)
            if choice == 'quit':
                print '''
Your shopping list: %s
Remaining salary: %s
welcome to next shopping
#######################################################################''' % (shoplist,salary)  #显示购物列表、剩余现金
                break
            elif result == 0:                           #商品名称不存在提示重输
                print " %s not in goods list, input right name:" % choice
                continue
            pgoods = pirce[products.index(choice)]
            if pgoods > salary:                          #当商品价格大于现金
                selection = raw_input("not engouh money for %s, you will use credit card ?[yes] or [no]:" %(choice)) #是否刷卡
                if selection == 'yes':
                    authentication()        #安全认证
                    load()              #读取data.pkl文件中
                    total = salary + available
                    if total >= pgoods:      #当信用卡和现金大于商品价格时
                        date = raw_input("Input your date:") #输入交易日期
                        event = choice      #事件
                        interest = 0        #利息
                        data = pgoods - salary  #数据
                        bill[date] = [event,data,interest] #以日期key其他元素为value保存至字典中
                        overdraft = overdraft + data
                        available =  available - pgoods + salary   
                        dump()          #保存至data.pkl文件中
                        shoplist.append(choice) #添加商品至购物列表
                        salary = 0      #现金清0
                        print '''%s add your shopping list %s
salary left:%s $
credit car left: %s $'''    %(choice,shoplist,salary,available)
                    else:               #钱不够
                        print "Sorry not engouh money ! "
            else:
                salary = salary - pgoods        #现金大于产品价格
                shoplist.append(choice)
                print "%s add your shopping list %s ,and your money left:%s $"  %(choice,shoplist,salary)
    elif option == '2': #提现金
        authentication()
        date = raw_input("Input the date:") #日期
        while True:
            load()
            information()
            print '''Your Salary: %s $
withdrawal:[yes]
quit:[no]''' % salary
            select = raw_input("your choice:[yes] or [no]") #是否继续
            if select == 'no':break
            withdrawal = int(raw_input("Input the withdrawal amount and the fee is 10%:"))
            if withdrawal > available:           #提取金额不能大于可用金额
                print "Beyond the maximun amount:"
                continue
            else:
                salary += withdrawal            #现金增加
                data = withdrawal + withdrawal / 10
                interest =  withdrawal / 10     #手续费为提取金额的10%
                available = available - data
                event = "remove"
                overdraft += data
                bill[date] = [event,data,interest]
                dump()                  #和之前一样
                print "The sucess of the transaction and you salary: %s $" % salary
                continue
    elif option == '3':     #还钱接口
        date = raw_input("Input the date:") #日期
        authentication()
        while True:
            load()
            information()
            print '''Your Salary: %s $
repayment:[yes]
quit:[no]''' % salary
            select = raw_input("your choice:[yes] or [no]")
            if select == 'no':break
            repayment = int(raw_input("Input the repayment amount:"))
            if repayment > salary:               #还钱金额不能大于你现金
                print "You don't have so much!"
            elif repayment > overdraft:          #还钱金额最多等于亏欠额度
                excess = repayment - overdraft
                salary = salary - repayment + excess
                event = "back"
                data = -overdraft
                interest = 0
                available += overdraft
                overdraft -= overdraft
                bill[date] = [event,data,interest]
                dump()
            else:                       #正常情况下
                salary = salary - repayment
                available += repayment
                overdraft -= repayment
                event = "back"
                data = -repayment
                interest = 0
                bill[date] = [event,data,interest]
                dump()
    elif option == '4': #查看信用卡明细
        load()
        print '''#######################################################################
DATE        EVENT       DATA        INTEREST'''
        for k,v in bill.items():
            print "%s       %s      %s      %s" %(k,v[0],v[1],v[2])
        information()
        print "#######################################################################"
        dump()
    elif option  == '5':    #退出
        sys.exit()


补充说明:日期这块是手动输入的,当时还没看到date模块,使用的时候每次日期尽量别重复,安全认证函数在查看信用卡明细的时候没有调用主要是为了方便查看,日期忘记排序了,运行效果应该如下:

模拟购物和信用卡_Python