You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将这段重复的Python多分支代码重构封装为可复用函数?

重构方案

这段代码的重复逻辑完全可以通过「抽离差异配置+封装通用函数」的方式消除,重构时还能一并修复原代码里隐藏的数值比较bug。


核心问题梳理

三个分支的逻辑完全一致,仅存在3处差异:

  • 收入类型的打印显示名
  • 1-12月统计用的数据源变量
  • 年度对比用的数据源变量

另外原代码存在两个可优化的问题:

  • 阈值计算后被转为字符串,和收入值做字典序比较,会出现数值判断错误(例如数值90 > 120不成立,但字符串比较"90" > "120"会返回True)
  • 月均值计算放在月度遍历循环内,每次累加后都重复计算,属于无效运算

重构实现

首先抽离收入类型的配置映射,再封装通用统计函数,主逻辑只需要做一次参数匹配即可:

# 收入类型配置:key为小写类型标识,value格式为(打印显示名, 月度数据源, 年度数据源)
INCOME_MAPPING = {
    "dividends": ("Dividends", dividends, dividends),
    "interests": ("Interests", interests, interests),
    "others": ("Other Types", othertypes, othertypes)
}

def income_stat(monthly_data, yearly_data, type_name, year_list):
    # 计算12个月收入总和、月均值
    total_monthly = 0
    for month in range(1, 13):
        total_monthly += int(monthly_data[month])
    monthly_mean = total_monthly / 12
    threshold = monthly_mean * 1.2

    # 遍历年度数据,打印超过阈值的记录
    for yr, income in zip(year_list, yearly_data):
        # 统一用数值比较,修复原代码字符串比较的bug
        if float(income) > threshold:
            print(f"In Year {yr} the income in {type_name} is (S$){income}.")

# 主逻辑:统一转小写匹配,无需枚举大小写变体
sell_key = sell.strip().lower()
if sell_key in INCOME_MAPPING:
    display_name, monthly_ds, yearly_ds = INCOME_MAPPING[sell_key]
    income_stat(monthly_ds, yearly_ds, display_name, year)

优化点说明

  • 冗余代码完全消除:后续新增收入类型时,只需要在INCOME_MAPPING中新增一行配置即可,不需要重复写分支和统计逻辑
  • 匹配逻辑更鲁棒:输入的sell值统一转小写后匹配,支持大小写混写的输入(例如"DivIDends"也能正常识别),不需要手动枚举所有大小写组合
  • 逻辑bug修复:去掉无意义的字符串转换,统一用数值做大小比较,统计结果准确
  • 性能优化:月均值、阈值仅在月度数据遍历完成后计算一次,减少无效运算

内容的提问来源于stack exchange,提问作者ehemehem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:12:20