我有一百个独特的函数,我们称之为func_{i}()
,其中{i}
是函数的编号,例如func_56()
。我有一个我基本上需要做的循环:
for item in list:
values[0] = func_0(item,values[0])
values[1] = func_1(item,values[1])
...
values[99] = func_99(item,values[99])
最狡猾的做法是什么?我能想到:
for item in list:
for i in range(100):
values[i] = eval('func_' + str(i) + '(item, values[i]')
但eval()
通常不被视为良好做法。
可替换地:
function_list = [func_0, func_1 .... ] # is there a way of doing this programmatically?
for item in list:
for i in range(100):
values[i] = function_list[i](item, values[i])
但是构建函数列表仍然看起来很难看,eval()
似乎是唯一的方法。即便如此,这个片段似乎可以变得更加优雅和pythonic,这可能不是最有效的做事方式。
出于这个问题的目的,可以安全地假设每个func_{i}()
都是完全唯一的,并且无法让它们共享代码,也无法将其压缩到少于100个独特函数。
答案 0 :(得分:3)
for item in list:
for i in range(100):
values[i] = locals()["func_%d" % (i)](item, values[i])
根据您的功能定义方式,您可以使用locals()
或globals()
或getattr(some_module, "func_%d" % (i))
。
答案 1 :(得分:2)
假设函数都在一个对象中,例如all_func
,您可以使用getattr(..)
来获取函数:
for items in list:
for i in range(100):
values[i] = getattr(all_func,'func_%s'%i)(item,values[i])
从那以后会更安全:
all_func
中的哪些元素;和然而,开始定义数百个函数是相当不优雅的。这通常意味着有一个参数,func_42(para,meter)
可以推广到func(42,para,meter)
等。您应该考虑重新设计代码。