2014-02-11 138 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() 

当这个程序运行时,monthlyRate变量(在printPayments中定义)迭代,但calculateValues中计算的值不会迭代。我发现我需要给monthlyRate计算值作为参数,但我不确定如何做到这一点,没有一切都打破。迭代的Python问题

+0

提醒一下 - 如果答案很好地解决了你的问题,你应该正式接受它。祝你好运! – kbshimmyo

回答

0

这是容易的,如果你的代码是因为你已经输入了有你的return语句缩进太多

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

问题是,您的代码第一次遇到“返回”语句时,它将返回值并离开函数。看起来你正在用printRayments循环monthlyRate(monthlyRate = [4,5,6,7,8])。没关系。现在对于您的calculateValues函数,您希望将monthlyPayment和totalPayment返回给调用函数。您还需要将monthlyRate作为参数传入。

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

代码中有几个问题,您可以通过使用下面的代码执行比较来轻松查看。

  1. calculateValues:循环运行,并返回在第一次循环
  2. printPayments调用calculateValues但不拿起结果(这就是为什么在同一行再次印刷,再
  3. printPayments结果也打印在一个循环中 - 这意味着有一个不需要的循环
  4. main()调用calculateValues然后printPayments - 这意味着两个for循环再次调用的次数太多而不保存结果

这里的固定码:

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

OUTPUT:

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