2014-02-11 6 views
0
import math 
import sys 

def calculateValues(loanAmt, numYears): 
    for monthlyRate in range (4, 9): 
     monthlyRate = monthlyRate/100 
     monthlyPayment = loanAmt * monthlyRate/(1 - math.pow(1/(1 + monthlyRate), numYears * 12)) 
     totalPayment = monthlyPayment * numYears * 12 
     return monthlyRate, monthlyPayment, totalPayment 

def printPayments(monthlyRate, monthlyPayment, totalPayment, loanAmt, numYears): 
    print("Rate Monthly Payment Total Payment") 
    for monthlyRate in range (4, 9): 
     calculateValues(loanAmt, numYears) 
     print("{0}%  ${1:0.2f}   ${2:0.2f}".format(monthlyRate, monthlyPayment, totalPayment)) 

def repeat(): 
    question = str(input("Would you like to create a new table? (Enter y for yes): ")) 
    if (question == "y"): 
     main() 
    else: 
     sys.exit() 

def getPositiveFloat(): 
    loanAmt = int(input("Enter the amount of the loan: ")) 
    numYears = int(input("Enter the number of years: ")) 
    if (loanAmt < 0) or (numYears < 0): 
     print("Please enter a positive number for both questions") 
     main() 
    return loanAmt, numYears 

def main(): 
    loanAmt, numYears = getPositiveFloat() 
    monthlyRate, monthlyPayment, totalPayment = calculateValues(loanAmt, numYears) 
    printPayments(monthlyRate, monthlyPayment, totalPayment, loanAmt, numYears) 
    repeat() 

main() 

Когда эта программа запускается, переменная monthRate (определенная в printPayments) выполняет итерацию, но значения, вычисленные в calculateValues, не повторяются. Я понял, что мне нужно дать monthRate для вычисления значений в качестве параметра, но я не уверен, как это сделать без всякого взлома.Проблема с Python с итерацией

+0

Просто напоминание - если ответ решил вашу проблему хорошо, вы должны официально принять ее. Удачи! – kbshimmyo

ответ

0

Это легко, если ваш код, как вы набрали там ваш оператор возврата отступом слишком много

def calculateValues(loanAmt, numYears): 
    myAnswer = [] 
    for monthlyRate in range (4, 9): 
     monthlyRate = monthlyRate/100 
     monthlyPayment = loanAmt * monthlyRate/(1 - math.pow(1/(1 + monthlyRate), numYears * 12)) 
     totalPayment = monthlyPayment * numYears * 12 
     thisRound = (monthlyRate, monthlyPayment, totalPayment) 
     myAnswer.append(thisRound) 
    return myAnswer 

Это должно выглядеть как выше вы возвращаетесь после первой итерации

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

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

def testFunction(somevalue): 
    for x in range(0, somevalue): 
     print 'hello' 
    return x 

y = testFunction(2) 

hello 
hello 
>>>y 
1 
+0

Я уже пробовал это, ничего не исправить. – user3295439

+0

Вы говорите, что ваш код отформатирован так, как я его отформатировал. – PyNEwbie

+0

. Вы должны быть более понятным, что вы ищете каждый из ежемесячных платежей – PyNEwbie

0

Проблема в том, что в первый раз, когда ваш код попадает в оператор «return», он вернет значение и покинет функцию. Похоже, вы зацикливаете на monthRate (monthRate = [4, 5, 6, 7, 8]) в printpayments. Хорошо. Теперь для функции calculateValues ​​вы хотите вернуть ежемесячный платеж и totalPayment обратно к вызывающей функции. Вам также необходимо передать monthRate в качестве параметра.

def calculateValues(monthlyRate, loanAmt, numYears): 
    monthlyRate = monthlyRate/100 
    monthlyPayment = loanAmt * monthlyRate \ 
       /(1 - math.pow(1/(1 + monthlyRate), numYears * 12)) 
    totalPayment = monthlyPayment * numYears * 12 
    return (monthlyPayment, totalPayment) 

def printPayments(monthlyRate, monthlyPayment, totalPayment, loanAmt, numYears): 
    print("Rate Monthly Payment Total Payment") 
    for monthlyRate in range (4, 9): 
     monthlyPayment, totalPayment = calculateValues(monthlyRate, loanAmt, numYears) 
     print("{0}%  ${1:0.2f}   ${2:0.2f}".format(monthlyRate, \ 
       monthlyPayment, totalPayment)) 

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

http://gettingstartedwithpython.blogspot.com/2012/05/variable-scope.html

Надеется, что это помогает.

+0

Это сработало. Большое вам спасибо – user3295439

2

В коде есть несколько проблем, которые вы можете легко увидеть, выполнив diff с помощью следующего кода ниже.

  1. calculateValues: работает в цикле и возвращает результат на первой итерации
  2. printPayments называет calculateValues ​​но не подобрать результат (поэтому в той же строке снова и снова печататься
  3. printPayments также печатает в цикле, что означает, что есть один цикл, который не нужен
  4. main() вызывает calculateValues, а затем printPayments - это означает, что два for-loops вызываются слишком много раз, опять же, без сохранения результата

Вот фиксированный код:

import math 
import sys 

def calculateValues(monthlyRate, loanAmt, numYears): 
    monthlyRate = monthlyRate/100 
    monthlyPayment = loanAmt * monthlyRate/(1 - math.pow(1/(1 + monthlyRate), numYears * 12)) 
    totalPayment = monthlyPayment * numYears * 12 
    return monthlyRate, monthlyPayment, totalPayment 

def printPayments(loanAmt, numYears): 
    print("Rate Monthly Payment Total Payment") 
    for monthlyRate in range (4, 9): 
     monthlyRate, monthlyPayment, totalPayment = calculateValues(monthlyRate, loanAmt, numYears) 
     print("{0}%  ${1:0.2f}   ${2:0.2f}".format(int(monthlyRate*100, monthlyPayment, totalPayment)) 

def repeat(): 
    question = str(input("Would you like to create a new table? (Enter y for yes): ")) 
    if (question == "y"): 
     main() 
    else: 
     sys.exit() 

def getPositiveFloat(): 
    loanAmt = int(input("Enter the amount of the loan: ")) 
    numYears = int(input("Enter the number of years: ")) 
    if (loanAmt < 0) or (numYears < 0): 
     print("Please enter a positive number for both questions") 
     main() 
    return loanAmt, numYears 

def main(): 
    loanAmt, numYears = getPositiveFloat() 
    printPayments(loanAmt, numYears) 
    repeat() 

main() 

ВЫВОД:

Enter the amount of the loan: 100 
Enter the number of years: 20 
Rate Monthly Payment Total Payment 
4%  $4.00   $960.08 
5%  $5.00   $1200.01 
6%  $6.00   $1440.00 
7%  $7.00   $1680.00 
8%  $8.00   $1920.00 
Would you like to create a new table? (Enter y for yes): 

Я думаю, что что-то не так, как вы вычислить интерес здесь:

monthlyPayment = loanAmt * monthlyRate/(1 - math.pow(1/(1 + monthlyRate), numYears * 12)) 

, но эта часть Я позволю вам решить самостоятельно;)

+0

Я пробовал ваш код, и он не работал должным образом. Я также не уверен, что вы изменили. – user3295439

+0

См. Обновленный ответ – alfasin

Смежные вопросы