0

这是我的第一个问题,因此对于我确信我会犯的任何发布错误,我深表歉意。我确实首先搜索了以前回答的问题,但我没有找到合适的解决方案,尽管我认识到我可能没有使用正确的术语或关键字进行搜索。

我有一个通用函数,我想在 Python 中快速评估它。它被传递给优化器(fmin_cobyla),我希望它只接受一个参数。我希望能够选择使用可能由标志控制的此功能的不同变体(变体?口味?)。由于我希望快速评估它,因此在函数中包含一堆 if 或 case 语句是没有意义的(对吗?),所以目前我有围绕函数变体定义的 if 语句:

if flag==1:
    def f(x):
        for i in range(0,len(x)*3,3):
            A[i:i+3,i:i+3]=1/x[i/3]*np.eye(3)
        tmp=np.linalg.solve(A,b)
        y=somecmodulefunction(tmp)
        return y
elif flag==2:
    def f(x):
        for i in range(0,len(x)*3,3):
            A[i:i+3,i:i+3]=x[i/3]*np.eye(3)
        tmp=np.linalg.solve(A,b)
        y=somecmodulefunction(tmp)
        return y
...

除一行外,功能相同。这是正确的方法吗?有没有办法做到这一点,如果我有 10 个不同的变体,它不仅仅是一个长而笨重的代码块?

谢谢!

4

2 回答 2

0

为什么不将标志变量作为输入也传递给函数呢?

def f(x, flag):
    for i in range(0,len(x)*3,3):
        if flag == 1:
           A[i:i+3,i:i+3]=1/x[i/3]*np.eye(3)
        elif flag == 2:
           A[i:i+3,i:i+3]=x[i/3]*np.eye(3)
    tmp=np.linalg.solve(A,b)
    y=somecmodulefunction(tmp)
    return y

如果有默认flag,您可以使用Default Argument Values

def f(x, flag=1):
    for i in range(0,len(x)*3,3):
        if flag == 1:
           A[i:i+3,i:i+3]=1/x[i/3]*np.eye(3)
        elif flag == 2:
           A[i:i+3,i:i+3]=x[i/3]*np.eye(3)
    tmp=np.linalg.solve(A,b)
    y=somecmodulefunction(tmp)
    return y

因此,当你这样做时f(10),函数f()将使用flagequals to执行1

如果你想使用另一个flag值,你可以简单地做f(10,2)

于 2015-06-13T23:38:45.083 回答
0

尝试尽可能少地重复自己。这意味着仅指定差异,即该表达式的反转。其余的都是一样的。如果你想改变计算方式,那么你只需要在一个地方进行改变。

def f(x, flag):
    for i in range(0,len(x)*3,3):
        temp = x[i/3]*np.eye(3)
        if flag-2:
            temp = 1/temp
        A[i:i+3,i:i+3] = temp
    tmp=np.linalg.solve(A,b)
    y=somecmodulefunction(tmp)
    return y

flagis2时,if分支不会被执行,因为2-2equals0是一个错误的值。当flagis1时,if分支将被执行,因为1-2equals-1是一个真实值。但是,我建议使用布尔标志(即,期望Trueor的值False),这样您就可以做if flag:True表明您想要反转。

于 2015-06-13T23:53:50.997 回答