web-dev-qa-db-ja.com

Python TypeError:サポートされていないオペランドタイプ-: 'int'および 'function'

私はPythonの初心者で、課題に取り組んでいます。エラーを調査して提案された修正を適用した後も、TypeError: unsupported operand type(s) for -: 'int' and 'function'を取得し続けます。誰も探していません。解決策を教えてください。もう一度見ていただければ幸いです。何かが足りないのですが、何がわかりません。これは、問題が発生しているコードのセクションです。

month = 0
interestYDT = 0
balance = int(raw_input ("Enter balance on credit card: "))
annualInterestRate = float(raw_input ("Enter annual interest rate as a decimal: "))
monthlyPaymentRate = float(raw_input ("Enter minimum monthly payment rate as a decimal: "))
previousbalance = balance
#
def monthlyInterestRate(annualInterestRate):
    return float(annualInterestRate/12)
#
if month <= 12:
    def minimumMonthlyPayment(previousbalance):
        return (previousbalance * monthlyPaymentRate)
    def monthlyInterest(monthlyInterestRate):
        return (1 + monthlyInterestRate)
    minMonPay = minimumMonthlyPayment
    monInt = monthlyInterest
    newbalance = ((previousbalance - minMonPay) * (monInt))
    interestYDT = (interestYTD + montInt)
    previousbalance = (newbalance)
    print ''
    print ('Month:' (month))
    print ('Minimum monthly payment: $ ' (round(minimumMonthlyPayment, 2)))
    print ('Remainging balance: $ ' (round(newbalance, 2)))
    print ' '
    month = (month + 1)

これは私が得る全体のエラーです:

Traceback (most recent call last):
  File "C:/Users/Karla/Documents/_MIT 600X Introduction to CS and Prog/Assignments/Week2/kmarciszewski_week2_Problemset_Problem1.py", line 33, in <module>
    newbalance = ((previousbalance - minMonPay) * (monInt))
TypeError: unsupported operand type(s) for -: 'int' and 'function'

どんな洞察も本当にありがたいです。ありがとうございました。

7
KMarciszewski

関数を呼び出すには、関数名と必要なパラメーターの後に親を追加する必要があります。

これらの2行で

minMonPay = minimumMonthlyPayment
monInt = monthlyInterest

関数をminMonPay、monIntという名前に割り当てますが、実際にはそれらを呼び出しません。むしろ、次のように書く必要があります。

minMonPay = minimumMonthlyPayment(previousBalance)
monInt = monthlyInterest(monthlyInterestRate)

この定義

def minimumMonthlyPayment(previousbalance):
    return (previousbalance * monthlyPaymentRate)

1つのパラメーターを受け取り、それをpreviousBalanceと呼ぶ関数を提供します。これは、コードの前半で作成した変数とは何の関係もありません。実際、名前を変更することをお勧めします。初心者として混乱させるだけです。

さらに、作成した関数は非常に単純で、それぞれ1回だけ使用されるため、関数を削除してコードをインライン化することをお勧めします。

# OLD CODE
def minimumMonthlyPayment(previousbalance):
    return (previousbalance * monthlyPaymentRate)
def monthlyInterest(monthlyInterestRate):
    return (1 + monthlyInterestRate)
minMonPay = minimumMonthlyPayment
monInt = monthlyInterest

# NEW CODE
minMonPay = previousbalance * monthlyPaymentRate
monInt = 1 + monthlyInterestRate

これを行う場合は、minimumMonthlyPayment関数を誤って使用する行を更新することを忘れないでください。

# OLD CODE
print ('Minimum monthly payment: $ ' (round(minimumMonthlyPayment, 2)))

# NEW CODE
print ('Minimum monthly payment: $ ' (round(minMonPay, 2)))
6
Johanna Larsson

問題はこの行にあると思いますminMonPay = minimumMonthlyPaymentメソッドを呼び出すのではなく、メソッドに変数を割り当てているように見えます。

0
Trevor Pilley

コードを見ると、関数を変数に割り当ててから、値から関数を減算しようとしているように見えます。

関数 'minimumMonthlyPayment(previousbalance)'を定義しますが、次に関数を変数 'minMonPay = minimumMonthlyPayment'に割り当てます。その後、previousBalance-minMonPayと言います。あなたがやろうとしていたことは次のとおりです。

minMonPay = minimumMonthlyPayment(previousbalance)

お役に立てば幸いです。

0
Mr-F