Вычислить промежуточную сумму во время цикла for — Python

Редактировать: Ниже приведен мой рабочий код, основанный на отзывах/ответах, которые я получил.

Этот вопрос проистекает из моего предыдущего вопроса, который возник во время изучения Python/CS с использованием открытого программного обеспечения MIT. --См. мой предыдущий вопрос здесь < /а>--

Я использую следующий код, чтобы составить список месячных платежей и прочего. Однако в конце цикла мне нужно указать промежуточную сумму общей суммы, выплаченной за месяцы.

Исходный код

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,)

person tehaaron    schedule 14.02.2011    source источник
comment
Почему вы не обновляете totalPaid? Почему вы устанавливаете его на новое значение? Почему бы не включить totalPaid в выражение?   -  person S.Lott    schedule 15.02.2011


Ответы (5)


Перед циклом инициализируйте переменную для накопления значения:

total_paid = 0

А затем в теле цикла добавьте к нему соответствующую сумму. Вы можете использовать оператор += для добавления к существующей переменной, например.

total_paid += 1

это краткая форма для total_paid = total_paid + 1. Вы не хотите давать total_paid новое значение на каждой итерации, а хотите добавить к его существующему значению.

Я не уверен в специфике вашей проблемы, но это общая форма для накопления значения в цикле.

person Rafe Kettler    schedule 14.02.2011
comment
Спасибо, что сделали это более ясным для меня. Я смог экстраполировать то, что вы сказали, и добавил totalPaid = 0 перед циклом, а внутри цикла я добавил totalPaid += round(minPayment, 2) - person tehaaron; 15.02.2011
comment
@tehaaron нет проблем, всегда рад помочь кому-то изучить Python - person Rafe Kettler; 15.02.2011

Вы всегда делаете минимальный платеж? Просто используйте 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,)

Также обратите внимание, что диапазон имеет ровно одно значение, поэтому вы просто проверите месяц == 12, но здесь это просто не нужно.

person Fred Nurk    schedule 14.02.2011
comment
Спасибо, это в основном именно то, что я сделал, но я добрался до него после прочтения ответа Рэйфа, поэтому я дал его ему. :) Я ценю быстрый ответ после того, как вы прокомментировали мой предыдущий вопрос. - person tehaaron; 15.02.2011

На самом деле вам нужно инициализировать totalPaid до 0, а затем

totalPaid = round(interestPaid + principalPaid, 2) + totalPaid

Внутри петли. Ваша проблема в том, что вы не накапливаете общую сумму, вы просто устанавливаете новую на каждой итерации.

person erKURITA    schedule 14.02.2011

похоже, вы были рядом. Проблема в том, что вы каждый раз перезаписывали сумму. Попробуйте что-то вроде этого:

totalPaid = totalPaid + round(interestPaid + principalPaid, 2)
person GSto    schedule 14.02.2011

Этот ответ сработал для меня:

Сначала создайте производное значение:

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']
Index_Date 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
person Sloppy Joe    schedule 26.05.2021
comment
отредактируйте свой ответ, чтобы его можно было прочитать (как код). - person dpapadopoulos; 26.05.2021