在for循环中计算累积总和 - Python

2 投票
5 回答
32033 浏览
提问于 2025-04-16 11:50

编辑:以下是我根据收到的反馈和答案修改后的代码。

这个问题源于我在学习Python和计算机科学时,使用麻省理工学院的开放课程资料时遇到的一个问题。--可以查看我之前的问题--

我正在使用以下代码来制作每月付款和其他事项的列表。不过在循环结束时,我需要给出一个累计总额,显示到目前为止支付的总金额。

原始代码

balance = float(raw_input("Outstanding Balance: "))
interestRate = float(raw_input("Interest Rate: "))
minPayRate = float(raw_input("Minimum Monthly Payment Rate: "))

for month in xrange(1, 12+1):
    interestPaid = round(interestRate / 12.0 * balance, 2)
    minPayment = round(minPayRate * balance, 2)
    principalPaid = round(minPayment - interestPaid, 2)
    remainingBalance = round(balance - principalPaid, 2)


    print 'Month: %d' % (month,)
    print 'Minimum monthly payment: %.2f' % (minPayment,)
    print 'Principle paid: %.2f' % (principalPaid,)
    print 'Remaining balance: %.2f' % (remainingBalance,)

    balance = remainingBalance

    if month in xrange(12, 12+1):
        print 'RESULTS'
        print 'Total amount paid: '
        print 'Remaining balance: %.2f' % (remainingBalance,)

问题是我还没弄明白如何保持已支付金额的累计总额。我尝试过添加 totalPaid = round(interestPaid + principalPaid, 2),但这只计算了单个月的总额,我似乎无法让它保持每个月的值,然后在最后把所有的值加起来打印出来。

另外,我知道最终的金额应该是1131.12。

我找到了很多在已知每个值的情况下通过列表来做这个的例子,但我似乎无法正确地推导出这个方法。

修正后的代码

balance = float(raw_input("Outstanding Balance: "))
interestRate = float(raw_input("Interest Rate: "))
minPayRate = float(raw_input("Minimum Monthly Payment Rate: "))
totalPaid = 0

for month in xrange(1, 12+1):
    interestPaid = round(interestRate / 12.0 * balance, 2)
    minPayment = round(minPayRate * balance, 2)
    principalPaid = round(minPayment - interestPaid, 2)
    remainingBalance = round(balance - principalPaid, 2)
    totalPaid += round(minPayment, 2)

    print 'Month: %d' % (month,)
    print 'Minimum monthly payment: %.2f' % (minPayment,)
    print 'Principle paid: %.2f' % (principalPaid,)
    print 'Remaining balance: %.2f' % (remainingBalance,)

    balance = remainingBalance

    if month in xrange(12, 12+1):
        print 'RESULTS'
        print 'Total amount paid: %.2f' % (totalPaid,)
        print 'Remaining balance: %.2f' % (remainingBalance,)

5 个回答

1

这个回答对我有帮助:

首先,创建一个派生值:

df.loc[0, 'C'] = df.loc[0, 'D']

然后遍历剩下的行,填充计算出的值:

for i in range(1, len(df)):
    df.loc[i, 'C'] = df.loc[i-1, 'C'] * df.loc[i, 'A'] + df.loc[i, 'B']
索引日期 A B C D
2015/01/31 10 10 10 10
2015/02/01 2 3 23 22
2015/02/02 10 60 290 280
1

你总是只付最低金额吗?那就直接用minPayment,不用再去算那些复杂的数学了。你可以一直累加总金额,然后在循环结束后再打印出来。

balance = float(raw_input("Outstanding Balance: "))
interestRate = float(raw_input("Interest Rate: "))
minPayRate = float(raw_input("Minimum Monthly Payment Rate: "))
paid = 0

for month in xrange(1, 12+1):
    interestPaid = round(interestRate / 12.0 * balance, 2)
    minPayment = round(minPayRate * balance, 2)
    principalPaid = round(minPayment - interestPaid, 2)
    remainingBalance = round(balance - principalPaid, 2)
    paid += minPayment

    print  # Make the output easier to read.
    print 'Month: %d' % (month,)
    print 'Minimum monthly payment: %.2f' % (minPayment,)
    print 'Principle paid: %.2f' % (principalPaid,)
    print 'Remaining balance: %.2f' % (remainingBalance,)

    balance = remainingBalance

print
print 'RESULTS'
print 'Total amount paid:', paid
print 'Remaining balance: %.2f' % (remainingBalance,)

另外注意到range只有一个值,所以你只需要检查一下month是否等于12,但在这里其实没必要这么做。

4

在你开始循环之前,先初始化一个变量,用来累加值:

total_paid = 0

然后,在循环的主体部分,把合适的数值加到这个变量上。你可以使用 += 这个操作符来给已有的变量加值,比如:

total_paid += 1

这其实是 total_paid = total_paid + 1 的简写。你不想在每次循环时给 total_paid 赋一个新值,而是想在它原有的基础上加上新的值。

我不太清楚你具体的问题是什么,但这就是在循环中累加值的一般方法。

撰写回答