我正在尝试将某些功能与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
?预先感谢!
答案 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)