Python如何避免更新同一列表与字典时的代码重复?
如何避免更新列表和字典的重复代码?
方案1:提取独立的辅助处理函数
把重复的「结果判断+更新集合」逻辑抽成单独的函数,让原my_func专注于计算ret_1和ret_2,符合单一职责原则,代码解耦性更好:
def update_collections(ret_1, ret_2, target_list, target_dict, key): if ret_1 is not None and ret_2 is not None: target_list.append(ret_1) target_dict[key] = ret_2 # 原代码修改为: final_list = [] final_dict = {} for iter_1 in iterables_1: if condition_1: ret_1, ret_2 = my_func(...) update_collections(ret_1, ret_2, final_list, final_dict, iter_1) elif condition_2: for iter_2 in iterables_1: for iter_3 in iterables_3: ret_1, ret_2 = my_func(...) update_collections(ret_1, ret_2, final_list, final_dict, iter_1)
方案2:将更新逻辑整合进my_func(你的思路)
这种做法可行,但要权衡场景:
- 如果
my_func的唯一用途就是为了更新final_list和final_dict,这么做没问题,能减少调用处的代码量; - 但如果之后需要单独调用
my_func获取计算结果而不更新集合,这种耦合会导致代码冗余或需要重构。
另外,Python中列表和字典是可变对象,函数内部修改它们不需要返回(返回是多余的),可以简化代码:
def my_func(target_list, target_dict, key, ...): # 计算 ret_1, ret_2 if ret_1 is not None and ret_2 is not None: target_list.append(ret_1) target_dict[key] = ret_2 # 调用时不需要接收返回值 final_list = [] final_dict = {} for iter_1 in iterables_1: if condition_1: my_func(final_list, final_dict, iter_1, ...) elif condition_2: for iter_2 in iterables_1: for iter_3 in iterables_3: my_func(final_list, final_dict, iter_1, ...)
方案3:先收集所有有效结果,再批量更新
如果遍历逻辑不依赖实时更新的集合,可以先把所有符合条件的(ret_1, ret_2, key)收集起来,最后一次性更新列表和字典,完全消除重复代码:
final_list = [] final_dict = {} valid_results = [] for iter_1 in iterables_1: if condition_1: ret_1, ret_2 = my_func(...) if ret_1 is not None and ret_2 is not None: valid_results.append( (ret_1, ret_2, iter_1) ) elif condition_2: for iter_2 in iterables_1: for iter_3 in iterables_3: ret_1, ret_2 = my_func(...) if ret_1 is not None and ret_2 is not None: valid_results.append( (ret_1, ret_2, iter_1) ) # 批量更新 for ret1, ret2, key in valid_results: final_list.append(ret1) final_dict[key] = ret2
总结
优先推荐方案1,它既消除了重复代码,又保持了函数职责的清晰;如果场景特殊(比如my_func永远只服务于这两个集合),方案2也可以用;方案3适合不需要实时更新集合的场景,代码可读性也不错。
内容的提问来源于stack exchange,提问作者Carlo
相关产品推荐
相关产品推荐

