Как передать параметр в функцию, вызываемую в библиотеке Python Vegas? - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь интегрировать какую-то функцию с библиотекой 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 Ответ

2 голосов
/ 20 марта 2019

Одним из решений является наличие функции, которая будет строить вашу мощную функцию:

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

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

Этот метод обычно называется карри , здесь мы карри степенная функция, поэтому мы можем передавать параметры один за другим, а не все сразу. Обратите внимание, что если вам нужно сделать это с несколькими параметрами или если вы используете функцию, которую вы не можете контролировать, вы можете найти functools.partial полезным:

import functools

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

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