如何用Python语法糖封装product循环,减少变量重复书写?
实现自定义循环封装,减少变量重复书写
当然可以实现你想要的封装!核心思路是把笛卡尔积的生成和循环逻辑抽离成通用工具,让你只需要指定一次变量名和循环体逻辑。下面给你两种直观的实现方式:
方式一:用函数接收循环体作为参数
这种方式简单直接,把循环逻辑封装成一个函数,你只需要传入变量名列表、数据源字典,以及包含业务逻辑的回调函数:
from itertools import product def my_for_loop(var_names, data_dict, loop_body): # 根据变量名获取对应的数据源列表 sources = [data_dict[name] for name in var_names] # 遍历笛卡尔积 for items in product(*sources): # 将遍历到的元素和变量名绑定,传给循环体 loop_body(*items)
使用示例
假设你的数据源和API调用是这样的:
# 示例数据源 d = {'a': [1, 2, 3], 'b': ['x', 'y'], 'c': [True, False]} def API_Call1(val): print(f"调用API1: {val}") def API_Call2(val1, val2): print(f"调用API2: {val1}, {val2}")
现在你只需要定义一次变量名和循环体,就能完成循环:
def loop_body(a, b, c): API_Call1(a) API_Call2(b, c) # 执行封装后的循环 my_for_loop(['a', 'b', 'c'], d, loop_body)
方式二:用装饰器实现更简洁的语法
如果你想要更接近你设想的my_for_loop('a','b','c'):这种语法感,可以用装饰器来封装,代码会更优雅:
from itertools import product def loop_over(var_names, data_dict): def decorator(func): def wrapper(): sources = [data_dict[name] for name in var_names] for items in product(*sources): # 把遍历到的元素传给被装饰的函数 func(*items) return wrapper return decorator
使用示例
用装饰器标记你的循环体函数,变量名只需要在装饰器参数和函数参数里各写一次:
@loop_over(['a', 'b', 'c'], d) def my_loop(a, b, c): API_Call1(a) API_Call2(b, c) # 执行循环 my_loop()
关键说明
- 两种方式都实现了你的需求:变量名
a,b,c只需要书写两次(一次是变量名字符串列表,一次是循环体函数的参数),避免了在for语句和循环体里重复书写。 - 要确保
var_names里的字符串和数据源字典d的键完全对应,否则会抛出KeyError。 - 内存特性和原代码一致:
itertools.product是惰性生成的,不会一次性把所有组合加载到内存里(除非你主动转换为列表),所以处理大数据源也没问题。
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

