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

如何重构Python中三个相似的Excel计算方法?

重构重复的Python方法

原代码中三个方法逻辑高度重复,仅起始行号存在差异,我们可以将其重构为一个通用方法,以下是两种实用的实现方式:

方式一:直接传入起始行号

这种方式简洁直接,适合明确知道目标行号的场景:

def calculate_total_fruit_north_mid_south(start_row):
    sheet_factuur = excelWorkbook['Facturen ']
    # 提取南北中三个区域的数值
    total_north = sheet_factuur.cell(row=start_row, column=5).value
    total_mid = sheet_factuur.cell(row=start_row + 1, column=5).value
    total_south = sheet_factuur.cell(row=start_row + 2, column=5).value
    # 计算总量并打印
    total = total_north + total_mid + total_south
    print(total)

调用示例

# 计算Ananas的总量(起始行6)
calculate_total_fruit_north_mid_south(6)
# 计算Apples的总量(起始行9)
calculate_total_fruit_north_mid_south(9)
# 计算Waspeen的总量(起始行12)
calculate_total_fruit_north_mid_south(12)

方式二:通过水果名称映射行号

这种方式可读性更强,调用时直接传入水果名称即可:

# 定义水果名称与对应起始行的映射关系
FRUIT_START_ROWS = {
    'Ananas': 6,
    'Apples': 9,
    'Waspeen': 12
}

def calculate_total_fruit_north_mid_south(fruit_name):
    # 获取对应起始行,若水果名称不存在则提示并返回
    start_row = FRUIT_START_ROWS.get(fruit_name)
    if not start_row:
        print(f"未找到水果'{fruit_name}'的行号配置")
        return
    
    sheet_factuur = excelWorkbook['Facturen ']
    total_north = sheet_factuur.cell(row=start_row, column=5).value
    total_mid = sheet_factuur.cell(row=start_row + 1, column=5).value
    total_south = sheet_factuur.cell(row=start_row + 2, column=5).value
    total = total_north + total_mid + total_south
    # 打印时带上水果名称,结果更清晰
    print(f"{fruit_name}的南北中区域总量:{total}")

调用示例

calculate_total_fruit_north_mid_south('Ananas')
calculate_total_fruit_north_mid_south('Apples')
calculate_total_fruit_north_mid_south('Waspeen')

重构思路说明

  • 提取重复逻辑:三个原方法的核心操作都是获取连续三行第5列的值、求和、打印,唯一变量是起始行号
  • 抽象可变参数:将起始行号作为方法参数,或通过映射表关联水果名称与行号,让方法具备通用性
  • 降低维护成本:后续新增水果时,只需添加映射表条目或传入新的起始行号,无需复制粘贴整个方法代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:30:57