【题目】假设你是一家小企业的财务人员,企业现在要实现固定资产折旧自动化,请你根据给定框架编写能够计算企业所有固定资产各年折旧额的程序。

In [1]:
# 创建变量存储初始信息
# 固定资产编号列表
bianhao = ['001', '002', '003', '004', '005', '006', '007', '008', '009', '010', '011', '012']
# 固定资产原值(元)
yuanzhi = [7000.00, 8500.00, 215000.00, 12300.00, 8400.00, 236000.00, 10500.00, 97000.00, 13480.00, 168200.00, 7880.00, 34882.00]
# 使用年限(年)
shiyong_nianxian = [3, 3, 10, 5, 3, 4, 6, 8, 6, 10, 3, 8]
# 残值率
canzhilv = [0.03, 0.03, 0.05, 0.05, 0.03, 0.05, 0.04, 0.05, 0.05, 0.05, 0.03, 0.05]
# 折旧方式:'年限平均法'(直线法)或 '年数总和法'
zhejiu_fangshi = ['年限平均法', '年限平均法', '年数总和法', '年限平均法', '年数总和法', '年限平均法', '年数总和法', '年数总和法', '年限平均法', '年数总和法', '年限平均法', '年数总和法']
# 购入年份(所有资产均在2026年年初购入)
gouru_nianfen = 2026
In [2]:
# 自定义四舍五入函数
from decimal import Decimal, ROUND_HALF_UP

def sishiwuru(num, n=2):
    """将数值四舍五入保留n位小数"""
    d = Decimal(str(num))
    exp = Decimal('0.1') ** n
    return float(d.quantize(exp, rounding=ROUND_HALF_UP))
In [3]:
# 自定义直线折旧法计算年折旧额的函数:要求将年折旧额存储在字典中,返回字典结果(key='20XX年')
def zhixian_zhejiu(yuanzhi, canzhilv, nianxian, kaishi_nian=2026):
    """
    年限平均法(直线法):
    年折旧额 = (原值 - 残值) / 使用年限 = 原值 × (1 - 残值率) / 使用年限
    前n-1年按公式四舍五入,最后一年用可折旧总额减去已提折旧,消除尾差
    """
    kezhejiu = yuanzhi * (1 - canzhilv)          # 可折旧金额
    nian_zhejiu = kezhejiu / nianxian             # 每年理论折旧额
    jieguo = {}
    yiti_leiji = 0                                # 已计提折旧累计
    for i in range(nianxian - 1):
        nianfen = str(kaishi_nian + i) + '年'
        zhejiu_e = sishiwuru(nian_zhejiu)
        jieguo[nianfen] = zhejiu_e
        yiti_leiji += zhejiu_e
    # 最后一年倒挤差额,确保各年折旧之和等于可折旧金额
    nianfen = str(kaishi_nian + nianxian - 1) + '年'
    jieguo[nianfen] = sishiwuru(kezhejiu - yiti_leiji)
    return jieguo
In [4]:
# 自定义年数总和法计算年折旧额的函数:要求将年折旧额存储在字典中,返回字典结果(key='20XX年')
def nianshu_zonghe(yuanzhi, canzhilv, nianxian, kaishi_nian=2026):
    """
    年数总和法:
    年折旧额 = 可折旧金额 × 尚可使用年数 / 年数总和
    年数总和 = n × (n + 1) / 2
    """
    kezhejiu = yuanzhi * (1 - canzhilv)
    nianshu_he = nianxian * (nianxian + 1) // 2   # 年数总和
    jieguo = {}
    yiti_leiji = 0
    for i in range(nianxian - 1):
        nianfen = str(kaishi_nian + i) + '年'
        sheng_yu = nianxian - i                   # 尚可使用年数
        zhejiu_e = sishiwuru(kezhejiu * sheng_yu / nianshu_he)
        jieguo[nianfen] = zhejiu_e
        yiti_leiji += zhejiu_e
    nianfen = str(kaishi_nian + nianxian - 1) + '年'
    jieguo[nianfen] = sishiwuru(kezhejiu - yiti_leiji)
    return jieguo
In [5]:
# 循环计算所有固定资产的年折旧额:创建字典接收计算结果(key=编号, value=年折旧额字典)
suoyou_zhejiu = {}

for i in range(len(bianhao)):
    if zhejiu_fangshi[i] == '年限平均法':
        suoyou_zhejiu[bianhao[i]] = zhixian_zhejiu(yuanzhi[i], canzhilv[i], shiyong_nianxian[i], gouru_nianfen)
    else:
        suoyou_zhejiu[bianhao[i]] = nianshu_zonghe(yuanzhi[i], canzhilv[i], shiyong_nianxian[i], gouru_nianfen)

suoyou_zhejiu
Out[5]:
{'001': {'2026年': 2263.33, '2027年': 2263.33, '2028年': 2263.34},
 '002': {'2026年': 2748.33, '2027年': 2748.33, '2028年': 2748.34},
 '003': {'2026年': 37136.36,
  '2027年': 33422.73,
  '2028年': 29709.09,
  '2029年': 25995.45,
  '2030年': 22281.82,
  '2031年': 18568.18,
  '2032年': 14854.55,
  '2033年': 11140.91,
  '2034年': 7427.27,
  '2035年': 3713.64},
 '004': {'2026年': 2337.0,
  '2027年': 2337.0,
  '2028年': 2337.0,
  '2029年': 2337.0,
  '2030年': 2337.0},
 '005': {'2026年': 4074.0, '2027年': 2716.0, '2028年': 1358.0},
 '006': {'2026年': 56050.0,
  '2027年': 56050.0,
  '2028年': 56050.0,
  '2029年': 56050.0},
 '007': {'2026年': 2880.0,
  '2027年': 2400.0,
  '2028年': 1920.0,
  '2029年': 1440.0,
  '2030年': 960.0,
  '2031年': 480.0},
 '008': {'2026年': 20477.78,
  '2027年': 17918.06,
  '2028年': 15358.33,
  '2029年': 12798.61,
  '2030年': 10238.89,
  '2031年': 7679.17,
  '2032年': 5119.44,
  '2033年': 2559.72},
 '009': {'2026年': 2134.33,
  '2027年': 2134.33,
  '2028年': 2134.33,
  '2029年': 2134.33,
  '2030年': 2134.33,
  '2031年': 2134.35},
 '010': {'2026年': 29052.73,
  '2027年': 26147.45,
  '2028年': 23242.18,
  '2029年': 20336.91,
  '2030年': 17431.64,
  '2031年': 14526.36,
  '2032年': 11621.09,
  '2033年': 8715.82,
  '2034年': 5810.55,
  '2035年': 2905.27},
 '011': {'2026年': 2547.87, '2027年': 2547.87, '2028年': 2547.86},
 '012': {'2026年': 7363.98,
  '2027年': 6443.48,
  '2028年': 5522.98,
  '2029年': 4602.49,
  '2030年': 3681.99,
  '2031年': 2761.49,
  '2032年': 1840.99,
  '2033年': 920.5}}
In [6]:
# 通过循环语句编写计算2026年的年总折旧额的代码,并打印显示计算结果
zong_zhejiu_2026 = 0

for bianhao_key in suoyou_zhejiu:
    zong_zhejiu_2026 += suoyou_zhejiu[bianhao_key]['2026年']

print(f'2026年的年总折旧额为{zong_zhejiu_2026:.2f}元')
2026年的年总折旧额为169065.71元