在下面显示的情况下,我有一个名为func1()
的函数,它驻留在func3()
中,其中func3()
使用欧拉方法求解ODE的值。
def func1(x, y):
return y * np.log(y) / x
def func3(x, y, step_size, func):
dydx = func(x, y)
new_x = x + step_size
new_y = y _ step_size * dydx
return new_x, new_y
step_size - 0.1
lower = 2.0
upper = 3.0
e = 2.7182828284
x_val = [2.0]
y_val = [e]
for i in range(10):
x, y = func3(x_val[i], y_val[i], step_size, func1)
x_val.append(x)
y_val.append(y)
该代码将func1作为装饰器传递给func3,并在迭代范围为0到10时将输出写入列表。但是,func3()
中的代码被硬编码为{{ 1}},即func1()
和x
。我想写y
足够通用,只要它的前两个输入是func3()
和x
,您就可以将任何函数传递给它,但是它应该包含更多功能输入。因此,假设上面显示的所有代码都是相同的,但是我没有将y
传递给func1()
,而是传递了{whatwn}结构。
func2()
我该如何写func3()
使其足够通用,以使其可以使用两个函数中的任何一个,并理解它们是传递给def func2(x, y, z):
return z * y * np.log(y) / (x*z)
的更多参数,也必须传递给{ {1}}?
答案 0 :(得分:1)
您可以使用Python的可变长度参数语法来等待任何其他参数,然后将其传递。如果没有,则仍然可以使用:加星号的变量将接收到一个空列表作为其值,并且在秋天扩展到func
时将消失。
def func1(x, y):
return x+y
def func2(x, y, z):
return (x+y)*z
def caller(func, x, y, other, other2, *args):
return func(x, y, *args)
答案 1 :(得分:0)
使用*args
和**kwargs
收集参数(除了用于回调的x
和y
之外):
def func3(x, y, step_size, func, *args, **kwargs):
dydx = func(x, y, *args, **kwargs)
...
但是,请考虑一下func3
本身是否真的需要调用func
;让呼叫者代替。
def func3(x, y, step_size, dydx):
new_x = x + step_size
new_y = y - step_size * dydx
return new_x, new_y
for old_x, old_y in zip(x_val, y_val):
x, y = func3(old_x, old_y, step_size, func1(x, y))
...
答案 2 :(得分:0)
最好使用* args和** kargs(在python函数定义中的** kwargs用于传递带有关键字的可变长度参数列表。我们将名称kwargs与双星一起使用。原因是因为双星号使我们能够传递关键字参数以及任意数量的关键字参数。
例如:
def myFun(arg1,arg2,arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
args =(“嘿”,“嗨”,“再见”)
myFun(* args)
kwargs = {“ arg1”:“怪胎”,“ arg2”:“书呆子”,“ arg3”:“菜鸟”}
myFun(** kwargs)
输出: 嘿 你好 再见 极客 书呆子 菜鸟
答案 3 :(得分:0)
我认为您确实不需要接受x和y以外的其他参数或更改func3。
假设您要将z传递给内部函数。而且您还需要将其传递给func3。由于在func3调用期间z不会改变,因此您可以执行func3(x, y, lambda x, y : your_func (x, y , z), step)
之类的操作,并通过接受x和y的lambda使用带有任意数量参数的函数。
在您的情况下,呼叫将如下所示:
x, y = func3(x_val[i], y_val[i], step_size, lambda x, y: func2(x, y, 111))