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

问题描述 投票:0回答:1

我试图整合一些功能与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?提前致谢!

python function parameter-passing
1个回答
2
投票

一种解决方案是拥有一个能够构建您的电源功能的功能:

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

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

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

import functools

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

integrator(functools.partial(f, 2), nitn = 10, neval = 10000)
© www.soinside.com 2019 - 2024. All rights reserved.