迭代的Python问题

2024-05-04 09:32:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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中计算的值不会迭代。我发现我需要把monthyrate作为calculateValues的一个参数,但是我不知道如何在不破坏所有东西的情况下做到这一点。你知道吗


Tags: theimportforinputmaindefprintenter
3条回答

问题是,当代码第一次命中“return”语句时,它将返回值并离开函数。看起来您在printpayments中循环使用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

希望这有帮助。你知道吗

如果您的代码是您在那里输入的,那么返回语句缩进太多,这就很容易了

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

在第一次迭代后返回的代码应该与上面的代码类似

我在这里只是猜测,如果您想要每个迭代的结果,您需要将它们保存在某个容器中。我个人会把它们保存在字典里,但在你的目标更加明确之前,我还没有准备好

在您感到更舒服之前,您应该考虑的一件事是向函数中添加一些print语句,这样您就可以在每次迭代期间看到值是什么

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

y = testFunction(2)

hello
hello
>>>y
1

代码中有一些问题,通过使用下面的代码执行diff可以很容易地看到。你知道吗

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

输出:

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

但这部分我让你自己解决;)

相关问题 更多 >