用Python计算房贷的两种还款方式。
先搞清楚两个概念
公式需要用到幂运算()**和浮点数,正好复习一下。
等额本息:每月还款一样多
月供公式:

其中:
PP = 贷款本金(元)
rr = 月利率(年利率÷12)
nn = 还款总月数(年数×12)
代码实现
def equal_instalment(principal, annual_rate, years): """ 功能:计算等额本息方式下的月供、总还款额、总利息 参数: principal : float, 贷款本金(元) annual_rate : float, 年利率(如0.049表示4.9%) years : int, 贷款年限 返回值: monthly_payment : float, 每月固定还款额(元) total_payment : float, 总还款额(本金+利息) total_interest : float, 总利息 """ # 月利率 = 年利率 / 12 # 注意:除法结果自动变成浮点数,保留足够精度 monthly_rate = annual_rate / 12 # 总月数 = 年限 × 12 months = years * 12 # 计算 (1 + 月利率) ^ 总月数 # ** 是幂运算符,这里计算的是复利因子 factor = (1 + monthly_rate) ** months # 等额本息月供公式: # 月供 = 本金 × [月利率 × (1+月利率)^总月数] / [(1+月利率)^总月数 - 1] # 注意运算优先级:先乘方,再乘除,最后加减 monthly_payment = principal * monthly_rate * factor / (factor - 1) # 总还款额 = 月供 × 总月数 total_payment = monthly_payment * months # 总利息 = 总还款额 - 本金 total_interest = total_payment - principal # 返回三个值(实际上返回一个元组,Python自动打包) return monthly_payment, total_payment, total_interest
知识点
** 幂运算:(1+monthly_rate) ** months 就是计算
。注意浮点数的幂运算结果可能有微小误差,后面用round()处理即可。
变量命名:见名知意,principal本金,annual_rate年利率。
浮点数除法:annual_rate / 12 结果是浮点数,保留足够精度。
返回值:多个值用逗号分隔,实际上返回一个元组。
等额本金:每月还的本金一样
月供公式:第 kk 个月的月供 = 每月固定本金 + 当月剩余本金产生的利息
其中 kk 从1开始。
代码实现
def equal_principal(principal, annual_rate, years): """ 功能:计算等额本金方式下的首月月供、末月月供、总还款额、总利息 参数同上 返回值: first_month : float, 第一个月月供 last_month : float, 最后一个月月供 total_payment : float, 总还款额 total_interest : float, 总利息 """ monthly_rate = annual_rate / 12 months = years * 12 # 每月固定偿还的本金 = 总本金 / 总月数 principal_per_month = principal / months # 创建一个空列表,用来存储每个月的月供(方便以后分析) monthly_payments = [] # 累计总利息,初始为0 total_interest = 0 # 循环变量 month 从 1 到 months(包含) # range(1, months+1) 生成 [1, 2, 3, ..., months] for month in range(1, months + 1): # 当前月剩余本金 = 总本金 - 已经归还的本金 # 已经归还的本金 = 每月固定本金 × (month-1) # 注意:month从1开始,第一个月已经归还0元,最后一个月已经归还(months-1)份 remaining_principal = principal - principal_per_month * (month - 1) # 当月利息 = 剩余本金 × 月利率 interest = remaining_principal * monthly_rate # 当月月供 = 固定本金 + 当月利息 payment = principal_per_month + interest # 把当月月供追加到列表中 monthly_payments.append(payment) # 累加利息 total_interest += interest # 总还款额 = 本金 + 总利息 total_payment = principal + total_interest # 返回:首月月供、末月月供、总还款额、总利息 # 首月就是列表的第一个元素(索引0),末月就是最后一个元素(索引-1) return monthly_payments[0], monthly_payments[-1], total_payment, total_interest
知识点
列表 []:用来保存每个月的月供,方便后续分析。
range(1, months+1):生成从1到总月数的整数序列,循环变量month代表第几个月。
principal_per_month * (month - 1):已经归还的本金总额。注意乘法优先级,不需要额外括号,但加上更清晰。
累加器 total_interest += interest:增强赋值操作符,等价于 total_interest = total_interest + interest。
对比一下:到底差多少?
写一个主程序,输入参数,输出两种方式的对比。
完整代码
"""房贷计算器(等额本息 vs 等额本金)知识点:函数定义、数字类型、幂运算、循环、列表、格式化输出"""# ---------- 第一部分:等额本息计算函数 ----------def equal_instalment(principal, annual_rate, years): """ 功能:计算等额本息方式下的月供、总还款额、总利息 参数: principal : float, 贷款本金(元) annual_rate : float, 年利率(如0.049表示4.9%) years : int, 贷款年限 返回值: monthly_payment : float, 每月固定还款额(元) total_payment : float, 总还款额(本金+利息) total_interest : float, 总利息 """ # 月利率 = 年利率 / 12 # 注意:除法结果自动变成浮点数,保留足够精度 monthly_rate = annual_rate / 12 # 总月数 = 年限 × 12 months = years * 12 # 计算 (1 + 月利率) ^ 总月数 # ** 是幂运算符,这里计算的是复利因子 factor = (1 + monthly_rate) ** months # 等额本息月供公式: # 月供 = 本金 × [月利率 × (1+月利率)^总月数] / [(1+月利率)^总月数 - 1] # 注意运算优先级:先乘方,再乘除,最后加减 monthly_payment = principal * monthly_rate * factor / (factor - 1) # 总还款额 = 月供 × 总月数 total_payment = monthly_payment * months # 总利息 = 总还款额 - 本金 total_interest = total_payment - principal # 返回三个值(实际上返回一个元组,Python自动打包) return monthly_payment, total_payment, total_interest# ---------- 第二部分:等额本金计算函数 ----------def equal_principal(principal, annual_rate, years): """ 功能:计算等额本金方式下的首月月供、末月月供、总还款额、总利息 参数同上 返回值: first_month : float, 第一个月月供 last_month : float, 最后一个月月供 total_payment : float, 总还款额 total_interest : float, 总利息 """ monthly_rate = annual_rate / 12 months = years * 12 # 每月固定偿还的本金 = 总本金 / 总月数 principal_per_month = principal / months # 创建一个空列表,用来存储每个月的月供(方便以后分析) monthly_payments = [] # 累计总利息,初始为0 total_interest = 0 # 循环变量 month 从 1 到 months(包含) # range(1, months+1) 生成 [1, 2, 3, ..., months] for month in range(1, months + 1): # 当前月剩余本金 = 总本金 - 已经归还的本金 # 已经归还的本金 = 每月固定本金 × (month-1) # 注意:month从1开始,第一个月已经归还0元,最后一个月已经归还(months-1)份 remaining_principal = principal - principal_per_month * (month - 1) # 当月利息 = 剩余本金 × 月利率 interest = remaining_principal * monthly_rate # 当月月供 = 固定本金 + 当月利息 payment = principal_per_month + interest # 把当月月供追加到列表中 monthly_payments.append(payment) # 累加利息 total_interest += interest # 总还款额 = 本金 + 总利息 total_payment = principal + total_interest # 返回:首月月供、末月月供、总还款额、总利息 # 首月就是列表的第一个元素(索引0),末月就是最后一个元素(索引-1) return monthly_payments[0], monthly_payments[-1], total_payment, total_interest# ---------- 第三部分:主程序(用户交互) ----------def loan_comparison(): """ 主函数:获取用户输入,调用两个计算函数,打印对比结果 """ # 打印一个分隔线,宽度50,内容居中 print("="*50) print(" 房贷计算器(等额本息 vs 等额本金)") print("="*50) # 获取输入 # float() 将字符串转为浮点数 # input() 返回用户输入的字符串 # 注意:输入“100”时,100 * 10000 = 1000000(元) principal = float(input("请输入贷款本金(万元):")) * 10000 annual_rate = float(input("请输入年利率(如4.9% 输入 0.049):")) years = int(input("请输入贷款年限:")) # int()转整数 # 调用等额本息函数,返回三个值,按顺序赋值 mp_inst, total_inst, interest_inst = equal_instalment(principal, annual_rate, years) # 调用等额本金函数,返回四个值 first_month, last_month, total_princ, interest_princ = equal_principal(principal, annual_rate, years) # 打印等额本息结果 print("\n--- 等额本息 ---") # round(x, 2) 保留两位小数 print(f"每月固定月供:{round(mp_inst, 2)} 元") print(f"总还款额:{round(total_inst, 2)} 元") print(f"总利息:{round(interest_inst, 2)} 元") # 打印等额本金结果 print("\n--- 等额本金 ---") print(f"首月月供:{round(first_month, 2)} 元") print(f"末月月供:{round(last_month, 2)} 元") print(f"总还款额:{round(total_princ, 2)} 元") print(f"总利息:{round(interest_princ, 2)} 元") # 计算两种方式总利息的差值 diff_interest = interest_inst - interest_princ print(f"\n【结论】等额本金比等额本息节省利息:{round(diff_interest, 2)} 元") # 判断前期压力:如果等额本金首月月供超过等额本息月供的1.5倍,则提醒 if first_month > mp_inst * 1.5: print("注意:等额本金前期还款压力较大,请根据自身收入合理安排。") else: print("两种方式前期压力相近,等额本金更省利息。")# ---------- 第四部分:入口 ----------# 这个判断的意思是:如果当前文件是直接运行(而不是被其他文件导入),则执行下面的代码# 这是一种常见的Python写法,可以避免在导入模块时自动执行if __name__ == "__main__": loan_comparison()
运行示例
请输入贷款本金(万元):100请输入年利率(如4.9% 输入 0.049):0.049请输入贷款年限:30--- 等额本息 ---每月固定月供:5307.27 元总还款额:1910616.19 元总利息:910616.19 元--- 等额本金 ---首月月供:6861.11 元末月月供:2789.47 元总还款额:1737041.67 元总利息:737041.67 元【结论】等额本金比等额本息节省利息:173574.52 元注意:等额本金前期还款压力较大,请根据自身收入合理安排。
代码中藏着的所有知识点
除了数字类型和运算,这次还学到了不少新东西。
1. 浮点数处理——避开 0.1+0.2 的坑
计算利息时,principal * monthly_rate 等运算会产生不确定尾数。这里我们用 round(..., 2) 格式化输出,不直接比较浮点数,所以安全。
2. 幂运算 ** 的优先级
(1+monthly_rate) ** months 中,指数运算优先级高于乘法,但括号保证了先加后乘方。
3. 列表与循环
monthly_payments = [] 创建一个空列表,append() 添加元素。循环变量 month 从1开始,符合日常习惯。
4. 字符串格式化——f-string 的妙用
f"首月月供:{round(first_month, 2)} 元" 直接在花括号里写表达式,非常方便。
5. 条件判断 if
比较首月月供与本息月供的1.5倍,给出建议。这是程序智能化的体现。
6. 模块化设计
把两个算法分别写成函数,主程序只负责输入输出。以后想复用,直接 import 这个模块即可。
我的一点小感悟
35岁学AI,不是为了当程序员,而是为了让自己在面对生活中的选择时,多一个理性思考的工具。
代码和数据不会骗人,它们只会给你客观的答案。
📌 今日学习笔记:
学到了什么:
等额本息公式及Python实现(幂运算、浮点数)
等额本金公式及列表记录月供
for 循环与 range() 的灵活使用
累加求和 total_interest += interest
f-string 格式化输出(保留两位小数 :.2f 与 round())
函数封装:def 定义,return 多值
if __name__ == "__main__" 的作用(直接运行才执行,被导入时不执行)
踩坑记录:
忘记将月利率计算公式中的年利率除以12,直接用了年利率,算出来的月供高得离谱。
等额本金中,剩余本金计算时 month-1 忘记减1,导致第一期利息算少了。
float( input() ) 输入中文会报错,暂时未做异常处理(以后学 try...except 再优化)。
用时: 1小时
📢 我是老李,35岁规划师,从零开始学AI。
每天1小时,记录真实学习路。不求成为大神,只为多一条出路。
如果你也在传统行业或者对未来感到焦虑,如果你也想学点新东西但一直没有开始
点击关注,我们一起进步;
也欢迎点赞 ❤️ 分享 ➕ 推荐,让更多同行者看到!
👇👇👇