如何将这段重复的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
相关产品推荐
相关产品推荐

