如何组合两个具有相同参数的函数?

2024-06-18 01:55:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个给定的函数

def unnorm(x, alpha, beta):
    return (1 + alpha * x + beta * x ** 2)

然后,我对它进行集成以在一个范围内找到一个规范化常量,并将其转换为一个lambda函数,该函数的参数与unnorm相同。现在,为了创建一个合适的对象,我将函数组合如下:

^{pr2}$

这很好,但是仍然存在重复和从全局命名空间中提取名称的情况。在

如何以更简洁的方式组合这两个函数,而不必重写参数?E、 g

def normalized(func, normalizer):
    return func * normalizer

完整代码:

import sympy
import numpy as np
import inspect

def normalize_function(f, xmin, xmax):
    """
    Normalizes function to PDF in the given range
    """
    # Get function arguments
    fx_args = inspect.getfullargspec(f).args
    # Convert to symbolic notation
    symbolic_args = sympy.symbols(fx_args)
    # Find definite integral
    fx_definite_integral = sympy.integrate(f(*symbolic_args), (symbolic_args[0], xmin, xmax))
    # Convert to a normalization multiplication term, as a real function
    N = sympy.lambdify(expr = 1 / fx_definite_integral, args = symbolic_args)
    return N

def unnorm(x, alpha, beta):
    return (1 + alpha * x + beta * x ** 2)

norm = normalize_function(unnorm, -1, 1)

# How do I condense this to a generic expression?
def normalized(x, alpha, beta):
    return unnorm(x, alpha, beta) * norm(x, alpha, beta)

x = np.random.random(100)

print(normalized(x, alpha = 0.5, beta = 0.5))

Tags: to函数importalphareturndefargsfunction
2条回答

我看不出你现在所做的有什么不对。但出于美观的目的,这里有一些功能最小的替代品。在

def doubler(x, y, z):
    return 2*(x + y + z)

def halver(x, y, z):
    return 0.5*(x + y + z)

def doubler_halver_sumprod(*args):
    return doubler(*args) * halver(*args)

dhs = lambda *args: doubler(*args) * halver(*args)

doubler_halver_sumprod(1, 2, 3)  # 36
dhs(1, 2, 3)                     # 36

如果您想要一种真正可扩展的、函数式的方法,只需提取一次参数,这就可以:

^{pr2}$

好吧,一种方法是使用修饰符为函数实现*等等:

class composable:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        return self.func(*args, **kwargs)

    def __mul__(self, other):
        if callable(other):
            def wrapper(*args, **kwargs):
                return self(*args, **kwargs) * other(*args, **kwargs)
            return self.__class__(wrapper)
        return NotImplemented

@composable
def f(x):
    return 2 * x

@composable
def g(x):
    return x + 1

h = f * g # (2*x) * (x+1)
print(h(2))
# 12

您需要为__add____sub____div__添加类似的定义,可能还需要为反向方法{}等添加类似的定义。在

相关问题 更多 >