如何实现函数的变体/变体

时间:2015-06-13 23:34:44

标签: python function variations

这是我的第一个问题,所以我真诚地为任何发布的错误道歉,我相信我会这样做。我首先搜索了之前已回答的问题,但我找不到合适的解决方案,但我发现我可能没有使用正确的术语或关键字进行搜索。

我有一个通用函数,我想在Python中快速评估。它被传递给优化器(fmin_cobyla),我更喜欢它只接受一个参数。我希望能够选择使用可能由标志控制的此功能的不同变体(变体?flavors?)。既然我想快速评估一下,在函数中有一堆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个不同的变种,它不仅仅是一个长期笨拙的代码块?

谢谢!

2 个答案:

答案 0 :(得分:0)

为什么不传递flag变量作为函数的输入呢?

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()将使用flag等于1执行。

如果您想使用其他flag值,则可以执行以下操作:f(10,2)

答案 1 :(得分: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

flag2时,if分支将不会被执行,因为2-2等于0,这是一个假值。当flag1时,if分支将被执行,因为1-2等于-1,这是一个真值。但是,我建议使用布尔标志(即期望TrueFalse的值),这样您就可以if flag:True表示您想要倒置。