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

如何减少笛卡尔积循环两种实现方式的代码冗余?

优化冗余循环的简洁方案

这问题我太懂啦!你原来的代码(包括用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)

思路解释

  1. 分离变与不变:把重复的处理逻辑封装成process_a_b函数,这部分是完全不变的;
  2. 动态调整迭代顺序:用条件判断生成对应的iterables元组,两种模式分别对应(range(10), range(5))和(range(5), range(10));
  3. 统一循环逻辑:不管哪种模式,都用同一个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:51:39