繁体   English   中英

将参数传递给函数内的Python函数

[英]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()的确切输入,即xy 我想写func3()足够通用,只要它的前两个输入是xy ,就可以将任何函数传递给它,但是它应该能够容纳更多的输入。 因此,假设上面显示的所有代码都是相同的,但是我没有传递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收集参数(除了用于回调的xy之外):

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM