如何将参数传递给Python vegas库中调用的函数?

时间:2019-03-20 00:03:14

标签: python function parameter-passing

我正在尝试将某些功能与vegas库进行集成,该库是集成f(x) = lambda x: x ** 2.0的简单工具,是

import vegas
f = lambda x: x ** 2.0
integrator = vegas.Integrator([[0.0, 1.0]])
result = integrator(f, nitn = 10, neval = 10000)
print result

,它将打印[0.33333389(69)]并且是正确的。但是,如果我希望能够更改函数f的幂值,但添加如下所示的输入参数

def f(x, p):
    return x ** p

方法Integrator将抱怨以下情况

SyntaxError: invalid syntax

使用global变量传递p会弄乱代码,因为在实践中,我有很多参数要传递到f上。使用以下替代定义将涉及更改函数的实际定义,而不是首选解决方案

def f(x, p = 2.0):
    return x ** p

那么我该怎么做才能将参数传递给方法f中调用的Integrator?预先感谢!

1 个答案:

答案 0 :(得分:2)

一种解决方案是拥有一个可以构建幂函数的函数:

def to_the_power(p):
    return lambda x: x ** p

result = integrator(to_the_power(2), nitn = 10, neval = 10000)

该技术通常称为currying,这里我们使用 curry 幂函数,因此我们可以一次传递一个参数,而不是一次传递所有参数。请注意,如果您需要使用多个参数来执行此操作,或者使用无法控制的功能,则可能会发现functools.partial有用:

import functools

def f(p, x):
    return x ** p

integrator(functools.partial(f, 2), nitn = 10, neval = 10000)