如何减少笛卡尔积循环两种实现方式的代码冗余?
优化冗余循环的简洁方案
这问题我太懂啦!你原来的代码(包括用product改写后的版本)之所以有冗余,核心是两种模式只是循环顺序和变量对应关系不同,但核心的处理逻辑(生成A、调用myfunction、打印)完全一样。咱们可以把变化的部分抽出来,让核心逻辑只写一次,彻底消除冗余~
最终优化代码
from itertools import product def myfunction(a): pass def process_a_b(a, b): A = "%010i" % a myfunction(a) print(A, b) def f(first_loop_on_a=True): # 根据参数决定迭代器的顺序 iterables = (range(10), range(5)) if first_loop_on_a else (range(5), range(10)) # 标记是否需要交换变量对应关系 need_swap = not first_loop_on_a # 统一遍历笛卡尔积,处理逻辑只写一次 for x, y in product(*iterables): if need_swap: process_a_b(y, x) else: process_a_b(x, y)
思路解释
- 分离变与不变:把重复的处理逻辑封装成
process_a_b函数,这部分是完全不变的; - 动态调整迭代顺序:用条件判断生成对应的
iterables元组,两种模式分别对应(range(10), range(5))和(range(5), range(10)); - 统一循环逻辑:不管哪种模式,都用同一个
product循环,只通过need_swap标记来决定是否交换x/y对应a/b的关系。
如果想再精简一点,甚至可以把交换逻辑写成一行:
def f(first_loop_on_a=True): iterables = (range(10), range(5)) if first_loop_on_a else (range(5), range(10)) for x, y in product(*iterables): process_a_b(*((y, x) if not first_loop_on_a else (x, y)))
这样整个函数里就没有重复的循环体啦,逻辑清晰又简洁~
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

