如何高效组合四个range,用单个for循环完成重复操作?
可以用单个循环实现,核心是提炼range组合规则
你原来的四个循环本质是两组a的遍历模式和两组b的遍历模式的两两组合:
- a的模式:
range(A1)(正向遍历)、range(A2, -1, -1)(反向遍历到0) - b的模式:
range(B1)(正向遍历)、range(B2, -1, -1)(反向遍历到0)
我们可以把这些模式的组合集中整理,再用迭代工具把所有(a,b)对串联起来,只用一个循环完成调用:
高效实现(借助itertools)
from itertools import chain obj = SomeClass() # 集中定义所有需要的a、b range组合 range_combinations = [ (range(A1), range(B1)), (range(A2, -1, -1), range(B1)), (range(A1), range(B2, -1, -1)), (range(A2, -1, -1), range(B2, -1, -1)), ] # 串联所有zip后的迭代器,一次遍历执行 for a, b in chain.from_iterable(zip(a_rng, b_rng) for a_rng, b_rng in range_combinations): obj.some_func(a, b)
无额外依赖的写法
如果不想导入库,用嵌套生成器表达式也能实现:
obj = SomeClass() range_combinations = [ (range(A1), range(B1)), (range(A2, -1, -1), range(B1)), (range(A1), range(B2, -1, -1)), (range(A2, -1, -1), range(B2, -1, -1)), ] for a, b in (pair for combo in range_combinations for pair in zip(*combo)): obj.some_func(a, b)
这种写法和原代码的执行顺序完全一致,重复的调用逻辑只写一次,后续调整range组合时,只需修改range_combinations列表即可,维护性更强。
内容的提问来源于stack exchange,提问作者Cheesewaffle
相关产品推荐
相关产品推荐

