场景编程集锦 - 躺平式赚钱

时间:2023-02-01 17:59:57

1. 场景描述

场景编程集锦 - 躺平式赚钱   “你不理财,财不理你”是投资理财最耀眼的标签。这句话可以说是家喻户晓,深入人心。仅从这一点就足以证明银行市场培育已是硕果累累。如果有人要问:最简单、最安逸的赚钱方式是什么呢?那一定是钱生钱,钱找钱。你可以购买银行存款类金融产品,稳稳地锁定投资收益,因为这类产品是受“存款保险条例”保护,是国家通过立法形式,对公众存款提供明确的法律保障。只要投资金额不超过50万,没有任何风险,或者说就是零风险;当然你也可以购买国债产品,因为有国家信誉背书,几乎没有投资风险,那绝对就是躺平式赚钱。   当我们从事投资理财时,必须谨记的金科玉律就是:凡是投资均有风险,仅仅是风险高低不同而已,通常遵循的是高风险,高收益的规律。当然也许会有例外的情况,以下投资案例或许颠覆人们的传统认知。你是否还记得P2P平台在中国大地上野蛮生长的时期,大量的担保公司和小贷公司纷纷创办线上业务,推出自己的P2P平台,作为吸纳投资资金的渠道;在资金应用端,小贷或担保公司把资金转手贷给一些小微型企业,由于资信的原因,银行很难为这样的企业授信放款。有P2P平台给出8%的投资收益,贷给企业20%借款利率;还有P2P平台投资收益率12%,贷给企业是18%。从投资风险的角度分析,投资收益为12%的P2P产品风险更大?结论是不一定!关键是要看贷款企业的还款意愿和能力。   下面是某银行正在发售的大额存单产品,到期一次性付息。大额存单期限分为1年期,2年期和3年期,分别对应的年化利率为2.28%、3.19%和4%,购买产品的起点金额为1万元,最小递增为100元。银行大额存单是受“存款保险条例”保护,购买金额不要超过50万元,投资零风险。   接下来,我们使用Python设计一个投资收益计算程序,根据客户选择购买产品,期限以及购买金额,计算出产品到期后的投资收益。这个程序具有一定的难度和挑战性,没有那么简单的。


2. 编程思路

  本案例的挑战性或者难点不是如何计算投资收益,而是在于我们如何使用合适的数据类型表示资金与货币。如果你之前没有编写过涉及金融、银行或者会计等应用领域的软件系统,多半是会掉进坑里。

2.1 货币表示

  使用浮点数表示资金和货币简直就是一个“坑”,令无数的程序员前赴后继,最终的结果是全掉坑理了。如果你编写程序涉及到货币表示、计算利息或者投资收益等,那么你应该牢记的真理:永远不要使用浮点数来表示货币资金并参与计算。因为计算机中的浮点数永远都是近似值的客观表示,不同类型的浮点数仅仅是表示的精度不同而已。为了便于理解这一点,我们启动Python交互式解释器,观察下面的表达式的计算结果,它可能要颠覆你的三观。

C:\>python
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1+0.2
0.30000000000000004
>>> 0.2-0.1
0.1
>>> 0.1*0.2
0.020000000000000004
>>> 0.2/0.1
2.0
>>> 0.3 - 0.1
0.19999999999999998
>>> 0.3 / 0.1
2.9999999999999996
>>>

  以上表达式求值结果表明:使用浮点数进行运算,的确会产生误差,特别是经过大运算量处理之后,这种误差会逐步积累并进一步放大。因此对于精度要求不高的应用来说,使用浮点数进行运算完全可行,但是对于金融或者会计等领域方面的应用程序开发来说,计算结果必须是分毫不差。这里举一个例子,如果你是银行的一位客户,银行告知你的银行卡账户利息约等于256.52元,你或许有这样的印象,这家银行不专业,银行计息有误差甚至是错误。的确如此,银行总不能告知客户账户的资金是一个近似值吧,因为客户总是期待银行能够正确而精准地记录账户中的资金和利息。   针对这个问题的解决方案是使用整数表示货币资金,避免使用浮点数。因为整数在计算机中的表示和运算是精准的,不会产生计算误差。这就是我们这个问题的终极解决方案。我们掌握了这个知识点,编写程序就是一件相对简单的事情了。

2.2 投资收益计算

  在本案例中,不涉及到投资收益的复利计算问题,计算理财产品投资收益非常简单,其计算公式如下所示:   投资收益 = 购买金额 x 利率 x 期限   其中的期限单位是年,利率是年化利率。


3. 程序代码

本程序只有一个模块,取名为invest.py,程序代码如下:

"""
  invest.py : 躺着把钱赚
"""
def convert(interest_rate):
    """
    功能:把利率转化为整数
    参数:interest_rate 年利率
    """
    decimal = interest_rate.split('.')[-1]   # ①
    number = len(decimal)  # ②
    decimal = int(decimal)
    return decimal, number

def is_valid(amount):
    """
    功能:检测购买金额的有效性
    参数:amount 购买金额
    """
    if amount >= 10000 and amount % 100 == 0:   # ③
        return True
    return False

def remove_zero(number):
    """
    功能:删除数字字符串尾部字符0
    参数:number 数字字符串
    """
    while True:
        if number[-1] == '0':
            number = number[:-1]   # ④ 
        else:
            break

    if number[-1] == '.':
        number = number[:-1]   # ⑤
    return number

def main():
    amount = int(input('购买金额(元):'))
    rate = input('年化利率:')
    years = int(input('产品期限(年):'))
    rate, number = convert(rate)

    if is_valid(amount):
        interest = amount * rate * years   # ⑥
        interest = str(interest)
        interest = interest[:-number] + '.' + interest[-number:]   # ⑦
        print('投资收益:', remove_zero(interest), '(元)')
    else:
        print('购买起点金额10000元,最小递增100元!')

if __name__ == '__main__':
    main()

主要函数及其功能说明如下: 函数convert(interest_rate):把浮点数表示的利率,转换为整数表示的利率。该函数返回一个元组,包含利率和小数位数。 函数is_valid(amount):判断购买金额是否符合购买条件。 函数remove_zero(number):去除数字字符串尾部的字符0。 函数main():主程序,获取输入数据,计算投资收益。 重要语句说明如下: 语句①获取利率字符串的小数部分,即小数点之后的字符串。 语句②获取利率的小数位数。 语句③判断购买资金是否满足起点金额为1万元,最小递增为100元条件。 语句④去掉数字字符串最后一个字符0。 语句⑤去掉数字字符串中的小数点。 语句⑥计算利息或者投资收益。 语句⑦在投资收益字符串中插入小数点。   从以上程序编码中可以看出,为了避免使用浮点数参与运算,首先是通过将利率的小数点向右移动指定位数,把利率转换成整数,在完成计算投资收益后,再将小数点向左移动指定位数。所以,这个程序版本比使用浮点数编程实现要复杂得多,但它消除了计算中的误差,应该说非常完美!


4. 执行效果

  下面我们将购买三种不同的银行理财产品,以此验证程序计算的准确性。

D:\cases\躺着把钱赚>python invest.py
购买金额(元):21300
年化利率:0.0319
产品期限(年):2
投资收益: 1358.94 (元)

D:\cases\躺着把钱赚>python invest.py
购买金额(元):21300
年化利率:0.0228
产品期限(年):1
投资收益: 485.64 (元)

D:\cases\躺着把钱赚>python invest.py
购买金额(元):213000
年化利率:0.04
产品期限(年):3
投资收益: 25560 (元)

D:\cases\躺着把钱赚>

  通过以上测试的情况,程序达到了设计需求,计算的投资收益分毫不差,非常精确。


5. 程序优化

  目前这版程序没有容错机制,对于从键盘输入数据如购买金额、利率以及期限,全都没有进行数据有效性校验,由于数据类型出错,可能造成程序执行过程中异常终止,因此我们有必要进一步完善程序。我们可以分为以下两步,修改程序模块invest.py。

5.1 新增 get_data()

def get_data():
    """
    获取输入数据
    """
    while True:
        try:
            amount = int(input('购买金额(元):'))
            rate = input('年化利率:')
            interest_rate = float(rate)
            years = int(input('产品期限(年):'))
            break
        except ValueError:
            print('输入数据错误,重新输入!')

return amount, rate, years

  在以上这段程序代码中,最核心的语句是使用了try-except语句,它实现了对输入数据产生的异常进行捕捉和处理,防止了因为数据转换int() / float()可能引发程序执行的异常终止。这个函数返回值是一个元组,包括购买金额、年化利率和产品期限等三个元素。

5.2 修改 main()

def main():
    amount, rate, years = get_data()
    rate, number = convert(rate)
    # 投资金额是否合规
    if is_valid(amount):
        # 计算投资收益
        interest = amount * rate * years
        interest = str(interest)
        interest = interest[:-number] + '.' + interest[-number:]

        print('投资收益:', remove_zero(interest), '(元)')

    else:
        print('购买起点金额10000元,最小递增100元!')

  通过对程序模块invest.py进行的两处修改和完善,增加了程序的容错处理功能,可以正确地进行输入数据有效性检测。经过程序运行表明:程序已经具备了处理数据异常的能力,能够防止程序执行意外终止,实现了程序优化设计目标。