2017-04-09 46 views
1

我正在创建一个适合各种曲线数据的程序。我创造了一些它做定义拟合函数如下:如何在不使用exec的情况下在每次迭代中对for循环使用不同的函数?

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)) 

在这个循环中,每个创建函数被调用的loop.The问题的每一次迭代是,我有使用EXEC()做的,让想我要做。这可能是不好的做法,并且必须有另一种方式来做到这一点。

而且,我不能使用超过numpy的,SciPy的其他图书馆和matplotlib

很抱歉的坏格式。该框只能使用很长的代码行。

+0

'Func2'是如何定义的? – Daniel

+0

'Funcs2'的内容是什么?首先,我怀疑你的第一个循环是一个好主意。 – chepner

+0

Funcs2是元组列表。每个元组包含3个字符串。我同意循环是一个坏主意,但我想不出另一种动态创建和命名函数的方法 – GaeafBlaidde

回答

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)) 

- >输出

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 
+0

谢谢你这真的很有帮助。 – GaeafBlaidde

+0

很高兴帮助!与未来的蟒蛇好运。 –

+1

就我个人而言,我认为使用f-字符串会使代码更难理解,因为f-字符串对于大多数读者来说可能是陌生的。我认为将函数调用和结果打印成单独的语句(例如:result = func(i); print(...)')会更好,这将更清楚地表明您正在调用函数而不是依靠一些字符串处理巫术。 –

相关问题