Python如何在主程序调用嵌套函数结果并打印 报NameError怎么解决
补充说明:提问者后续更新表示代码本身无问题,报错是所使用的在线IDLE网站故障导致。
报错原因
你遇到的 NameError: name 'vaam' is not defined 报错在常规Python环境下由两个问题导致:
- 缩进与代码执行顺序错误:
loan函数内部的计算逻辑没有正确缩进,且vaam函数的定义放在了loan函数的return语句之后。Python中函数内部代码需要统一缩进,且return执行后后续代码永远不会运行,相当于vaam函数实际从未被定义。 - 作用域规则限制:Python中嵌套定义在函数内部的函数属于外层函数的局部作用域,全局代码默认无法直接访问,就算
vaam被正确定义在loan内部,全局直接调用vaam()也会触发未定义报错。
修正方案
如果要求必须将vaam函数嵌套在loan函数内部,可以通过将嵌套函数绑定为外层函数属性的方式暴露给全局调用,修改后可运行代码如下:
# 计算月供的外层函数 def loan(principal,annual_interest_rate,duration): # 嵌套定义计算剩余余额的函数 def vaam(principal, annual_interest_rate, duration , number_of_payments): n = duration * 12 r = annual_interest_rate / 1200 if annual_interest_rate == 0: remaining_loan_balance = principal - principal * (number_of_payments / n) else: remaining_loan_balance = (principal * ((1 + r) ** n - (1 + r) ** number_of_payments)) / ((1 + r) ** n - 1) return remaining_loan_balance # 将嵌套函数绑定为外层函数的属性,全局可访问 loan.vaam = vaam # 原有月供计算逻辑 r = annual_interest_rate / 1200 n = duration * 12 if annual_interest_rate == 0: monthly_payment = principal / n else: monthly_payment = (principal * (r * (1 + r) ** n)) / ((1 + r) ** n - 1) return monthly_payment # 主程序 principal = float(input("Enter loan amount: ")) annual_interest_rate = float(input("Enter annual interest rate (percent): ")) duration = int(input("Enter loan duration in years: ")) monthly_pay = loan(principal, annual_interest_rate, duration) print('LOAN AMOUNT:', int(principal), 'INTEREST RATE (PERCENT):', int(annual_interest_rate)) print('DURATION (YEARS):', int(duration), 'MONTHLY PAYMENT:', int(monthly_pay)) for i in range(1, duration + 1): balance = loan.vaam(principal, annual_interest_rate, duration, i * 12) print('YEAR:', i, 'BALANCE:', int(balance), 'TOTAL PAYMENT:', int(monthly_pay * 12 * i))
内容的提问来源于stack exchange,提问作者shadi
相关产品推荐
相关产品推荐

