这是我的第一个问题,所以我真诚地为任何发布的错误道歉,我相信我会这样做。我首先搜索了之前已回答的问题,但我找不到合适的解决方案,但我发现我可能没有使用正确的术语或关键字进行搜索。
我有一个通用函数,我想在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个不同的变种,它不仅仅是一个长期笨拙的代码块?
谢谢!
答案 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
当flag
为2
时,if
分支将不会被执行,因为2-2
等于0
,这是一个假值。当flag
为1
时,if
分支将被执行,因为1-2
等于-1
,这是一个真值。但是,我建议使用布尔标志(即期望True
或False
的值),这样您就可以if flag:
并True
表示您想要倒置。