您可以编写函数以在Python中创建更多函数吗?

时间:2018-12-14 02:57:14

标签: python

我正在编写一个使用scipy优化包的可重复脚本。作为此过程的一部分,您需要创建约束函数。我想创建一个可重复的脚本,该脚本允许我基于可变数量的输入来创建正确数量的约束函数。

例如:

def constraintx1(x):
    return (x2c2*(x[1]**2))+(x1c2*x[1]) + maxresponsec2
def constraintx2(x):
    return (x2c3*(x[2]**2))+(x1c3*x[2]) + maxresponsec3
def constraintx3(x):
    return (x2c4*(x[3]**2))+(x1c4*x[3]) + maxresponsec4

constraints = [{'type':'ineq', 'fun':constraintx1},
               {'type':'ineq', 'fun':constraintx2},
               {'type':'ineq', 'fun':constraintx3}]

所有x2c2,x1c2和maxresponsec2都来自先前定义为curvestable的输入表。

这些是我的一些约束函数,用于3个输入变量。但是,在另一个项目中,我可能需要对12个变量重复此操作,并且我希望创建一个循环,该循环将基于计数器生成正确数量的约束函数。我一直在环顾四周,但还没有找到任何东西。我希望有一些类似的东西:

numberofvariables = len(someinput)
constraints = []
for g in range(0,numberofvariables):
    def constraintg (x):
        return curvestable.iloc[g,1]*(x[0]**2))+(curvestable.iloc[g,2]*x[0]) + curvestable.iloc[g,4]
    constraints = constraints.append([{'type':'ineq', 'fun':constraintg}])
    next

我还需要指出,我在编码方面非常业余,因此不确定是否可行。

2 个答案:

答案 0 :(得分:1)

您应该签出python closure函数。

def constraint_func_maker(x2c2, x1c2, maxresp):
    def constraint_func(x):
        return (x2c2 * (x[1] ** 2)) + (x1c2 * x[1]) + maxresp
    return constraint_func

答案 1 :(得分:0)

n = len(someinput)
ct = curvetable
constraints = [lambda x: ct.iloc[g,1]*(x[0]**2))+(ct.iloc[g,2]*x[0])+ ct.iloc[g,4] for g in range(n)]

这涉及使用两个关键的python元素:

  1. lambda表达式,它解决了您问题的核心-使用函数创建函数
  2. 列表理解,这只会使代码比for-loop plus append更干净

此外,由于您的curvetable(重命名为ct,以使代码更短)是DataFrame,因此您可以使用apply函数,但是我不想花太多精力来分散注意力要点-lambda表达式