如何重构两个存在重复逻辑的Python嵌套遍历函数以消除代码冗余
行列遍历异序的重复Python函数通用合并方案
核心实现逻辑
两个函数的唯一差异仅为嵌套遍历的顺序,判断逻辑、命中后的处理逻辑完全一致时,不需要重复编写固定逻辑代码,只需要把可变的遍历顺序抽象为可传入的参数,动态生成对应遍历坐标序列即可。
具体实现步骤
- 给通用函数新增遍历顺序控制参数,支持传入
row_first(先行后列)、col_first(先列后行)两种模式 - 根据传入的遍历顺序,动态生成对应的
(row, col)坐标遍历序列,不硬编码嵌套for循环顺序 - 将条件判断、单元格数值自增、后续关联代码(即原
# more code对应的逻辑)全部放在坐标遍历循环中,仅编写一次,实现全场景复用
合并前后的代码对比
重复编写的原有冗余代码
# 先行后列遍历版本 def traverse_row_first(board): row_cnt = len(board) col_cnt = len(board[0]) for row in range(row_cnt): for col in range(col_cnt): # 与另一函数完全一致的判断逻辑 if board[row][col] < 0: board[row][col] += 1 # 原more code 关联逻辑 pass # 先列后行遍历版本 def traverse_col_first(board): row_cnt = len(board) col_cnt = len(board[0]) for col in range(col_cnt): for row in range(row_cnt): # 完全复制的重复判断逻辑 if board[row][col] < 0: board[row][col] += 1 # 完全复制的more code 关联逻辑 pass
合并后的通用单函数实现
def unified_board_traverse(board, traverse_order="row_first"): row_cnt = len(board) col_cnt = len(board[0]) # 仅根据遍历顺序生成对应坐标序列 if traverse_order == "row_first": coord_iter = ((row, col) for row in range(row_cnt) for col in range(col_cnt)) elif traverse_order == "col_first": coord_iter = ((row, col) for col in range(col_cnt) for row in range(row_cnt)) else: raise ValueError("仅支持传入row_first(先行后列)/ col_first(先列后行)两种遍历顺序") # 以下逻辑仅编写一次,两个遍历模式完全复用 for row, col in coord_iter: # 原有统一的条件判断逻辑 if board[row][col] < 0: board[row][col] += 1 # 原有统一的more code 关联逻辑 pass
方案优势
- 彻底消除重复代码,后续修改判断逻辑、处理逻辑时,只需要修改一处即可同时覆盖两种遍历场景
- 后续如果新增其他遍历顺序(比如斜向遍历、Z字遍历),只需要在坐标生成部分新增对应分支即可,不需要重复编写核心处理逻辑
内容的提问来源于stack exchange,提问作者Kun.tito
相关产品推荐
相关产品推荐

