如何在不使用exec的情况下在每次迭代中使用for循环中的不同函数?

时间:2017-04-09 16:10:49

标签: python python-2.7 function for-loop

我正在创建一个适合各种曲线数据的程序。我创建了许多函数,通过执行以下操作来定义拟合:

for i in range(len(Funcs2)):
    func =  "+".join(Funcs2[i])
    func = func.format("[0:3]","[3:6]")
    exec('def Trial1{0}(x,coeffs): return {1}'.format(i, func))
    exec('def Trial1{0}_res(coeffs, x, y): return y - Trial1{0}
    (x,coeffs)'.format(i))

然后如何依次调用这些创建函数的每个函数。目前我正在做以下事情:

 for i in range(len(Funcs2)):
    exec('Trial1{0}_coeffs,Trial1{0}_cov,Trial1{0}_infodict,Trial1{0}_
          mesg,Trial1{0}_flag = 
          scipy.optimize.leastsq(Trial1{0}_res,x02, args=(x, y), 
          full_output = True)'.format(i))

在这个循环中,在循环的每次迭代中调用每个创建的函数。问题是我必须继续使用exec()来做我想做的事情。这可能是不好的做法,必须有另一种方法来做。

另外,我不能使用numpy,scipy和matplotlib以外的库

抱歉格式不正确。该框只能占用很长的代码行。

1 个答案:

答案 0 :(得分:4)

函数是python中的第一类对象!您可以将它们放在容器(如列表或元组)中,迭代它们,然后调用它们。不需要exec()或eval()。

要将函数作为对象而不是调用它们,请省略括号。

EG:

def plus_two(x):
    return x+2
def squared(x):
    return x**2
def negative(x):
    return -x

functions = (plus_two, squared, negative)
for i in range(1, 5):
    for func in functions:
        result = func(i)
        print('%s(%s) = %s' % (func.__name__, i, result))

- > OUTPUT

plus_two(1) = 3
squared(1) = 1
negative(1) = -1
plus_two(2) = 4
squared(2) = 4
negative(2) = -2
plus_two(3) = 5
squared(3) = 9
negative(3) = -3
plus_two(4) = 6
squared(4) = 16
negative(4) = -4