【问题标题】:How to use different functions in for loop in each iteration without using exec?如何在不使用 exec 的情况下在每次迭代中使用 for 循环中的不同函数?
【发布时间】:2017-04-09 16:10:49
【问题描述】:

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

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 以外的库

抱歉,格式错误。该框只能占用这么长的代码行。

【问题讨论】:

  • Func2 是如何定义的?
  • Funcs2的内容是什么?我怀疑你的第一个循环首先是一个好主意。
  • Funcs2 是一个元组列表。每个元组包含 3 个字符串。我同意循环是一个坏主意,但我想不出另一种动态创建和命名函数的方法
  • None 老实说,这听起来是个好主意。是什么让你认为你需要动态函数?您只需要带有参数的普通函数。
  • 我可以这样做,但是我想创建很多函数,使用普通函数需要很多代码,所以我希望动态地做到这一点

标签: python python-2.7 function for-loop


【解决方案1】:

函数是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

【讨论】:

  • 谢谢,这真的很有帮助。
  • 我个人认为 f-strings 的使用使代码更难理解,因为 f-strings 对大多数读者来说可能是陌生的。我认为最好将函数调用和结果的打印拆分为单独的语句(例如:result=func(i); print(...)`),这样可以更清楚地表明您正在调用函数而不是依赖一些字符串处理巫毒。
猜你喜欢
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 2013-03-29
  • 2023-02-26
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
相关资源
最近更新 更多