0

我很难理解为什么这个函数在 Jupyter Notebook 中显然失败了,但在 IPython shell 中却没有:

def present_value( r, n, fv = None, pmt = None ):
    '''
    Function to compute the Present Value based on interest rate and 
    a given future value. 

    Arguments accepted
    ------------------
       *   r = interest rate,
               which should be given in its original percentage, eg. 
               5% instead of 0.05

       *   n = number of periods for which the cash flow,
               either as annuity or single flow from one present value

       *  fv = future value in dollars,
               if problem is annuity based, leave this empty

       * pmt = each annuity payment in dollars,
               if problem is single cash flow based, leave this empty
    '''
    original_args = [r, n, fv, pmt]
    dec_args      = [Decimal( arg ) if arg != None
                                  else arg
                                  for  arg in original_args
                                  ]
    if dec_args[3] == None:
        return dec_args[2] / ( ( 1 + ( dec_args[0] / 100 ) )**dec_args[1] )

    elif dec_args[2] == None:
        #                     annuity_length = range( 1, dec_args[1] + 1 )
        #                     Not allowed to add a Decimal object
        #                     with an integer and to use it
        #                     in the range() function,
        #                     so we dereference the integer from original_args
        annuity_length = range( 1, original_args[1] + 1 )
        #                     Apply discounting to each annuity payment made
        #                     according to number of years left till end
        all_compounded_pmt = [dec_args[3] * ( 1 / ( ( 1 + dec_args[0] / 100 ) ** time_left ) ) \
                              for time_left in annuity_length
                              ]
        return sum( all_compounded_pmt )

当我导入这个函数所在的模块,命名functions.py,使用from functions import *,然后执行present_value(r=7, n=35, pmt = 11000)时,我得到了错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-93-c1cc587f7e27> in <module>()
----> 1 present_value(r=7, n=35, pmt = 11000)

/path_to_file/functions.py in present_value(r, n, fv, pmt)
     73     if dec_args[3] == None:
     74         return dec_args[2]/((1 + (dec_args[0]/100))**dec_args[1])
---> 75 
     76     elif dec_args[2] == None:
     77 #        annuity_length = range(1, dec_args[1]+1)

TypeError: 'decimal.Decimal' object cannot be interpreted as an integer

但是在 IPython shell 中,评估这个函数它工作得很好:

In [42]: functions.present_value(r=7, n=35, pmt = 11000)
Out[42]: Decimal('142424.39530474029537')

谁能帮我解决这个真正令人困惑和晦涩的问题?

4

0 回答 0