[英]Passing arguments to a Python function within a function
在下面显示的情况下,我有一个名为func1()
的函数,该函数驻留在func3()
,其中func3()
使用Euler方法求解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()
内部的代码被硬编码为func1()
的确切输入,即x
和y
。 我想写func3()
足够通用,只要它的前两个输入是x
和y
,就可以将任何函数传递给它,但是它应该能够容纳更多的输入。 因此,假设上面显示的所有代码都是相同的,但是我没有传递func1()
,而是将func2()
传递给func3()
,结构如下。
def func2(x, y, z):
return z * y * np.log(y) / (x*z)
我如何才能写出足够通用的func3()
,使其可以使用两个函数中的任何一个,并理解它们是传递给func1()
更多参数,也必须传递给func3()
?
您可以使用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)
使用*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))
...
最好使用* args和** kargs(在python函数定义中的** kwargs用于传递带有关键字的可变长度参数列表。我们将名称kwargs与双星一起使用。原因是因为double星号允许我们传递关键字参数以及任意数量的参数)。
例如:
def myFun(arg1,arg2,arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
args =(“嘿”,“嗨”,“再见”)
myFun(*参数)
kwargs = {“ arg1”:“极客”,“ arg2”:“书呆子”,“ arg3”:“ Noob”}
myFun(** kwargs)
输出:嗨,再见,怪胎书呆子Noob
我认为您确实不需要接受x和y以外的其他参数或更改func3。
假设您要将z传递给内部函数。 而且您还需要将其传递给func3。 由于在func3调用期间z不会改变,因此您可以执行func3(x, y, lambda x, y : your_func (x, y , z), step)
并通过接受x和年。
在您的情况下,呼叫将如下所示:
x, y = func3(x_val[i], y_val[i], step_size, lambda x, y: func2(x, y, 111))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.