我已经广泛搜索了此答案,但似乎找不到答案。因此,这是我第一次在这里发布问题。
我有一个函数,它使用许多参数来执行计算。根据用户输入,我想迭代某些(或全部)参数的可能值。如果我想遍历所有参数,则可以执行以下操作:
for i in range(low1,high1):
for j in range(low2,high2):
for k in range(low3,high3):
for m in range(low4,high4):
doFunction(i, j, k, m)
如果我只想迭代第一个和第四个参数,则可以这样做:
for i in range(low1,high1):
for m in range(low4,high4):
doFunction(i, user_input_j, user_input_k, m)
我的实际代码具有将近15个带有15个不同参数的嵌套for循环-每个参数都是可迭代的(或不可迭代的)。因此,对我来说,使用自己拥有的功能并为参数的每个可迭代或不可迭代的组合编写唯一的for循环块是不可扩展的。如果这样做的话,我将有2 ^ 15个不同的代码块。
我可以做这样的事情:
if use_static_j == True:
low2 = -999
high2 = -1000
for i in range(low1,high1):
for j in range(low2,high2):
for k in range(low3,high3):
for m in range(low4,high4):
j1 = j if use_static_j==False else user_input_j
doFunction(i, j1, k, m)
我只想知道是否有更好的方法。也许使用filter(),map()或列表理解...(我还没有足够清楚的了解)
如注释中所建议,您可以构建参数数组,然后使用数组中的每个值调用函数。构建数组的最简单方法是在定义每个参数范围的列表上使用递归。在此代码中,我假设了一个由start
,stop
和scale
参数组成的元组列表(例如,列表中的第三个元素产生了[3, 2.8, 2.6, 2.4, 2.2]
)。要使用静态值,可以使用元组(static, static+1, 1)
。
def build_param_array(ranges):
r = ranges[0]
if len(ranges) == 1:
return [[p * r[2]] for p in range(r[0], r[1], -1 if r[1] < r[0] else 1)]
res = []
for p in range(r[0], r[1], -1 if r[1] < r[0] else 1):
pa = build_param_array(ranges[1:])
for a in pa:
res.append([p * r[2]] + a)
return res
# range = (start, stop, scale)
ranges = [(1, 5, 1),
(0, 10, .1),
(15, 10, .2)
]
params = build_param_array(ranges)
for p in params:
doFunction(*p)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句