Python:获取参数输入并返回输出方程

Python: Taking parameter input and returning output equation

我正在开发一个项目,该项目需要一个函数(我将其称为目标),该函数接受一个名为 parameter_vector 的输入,并将输出一个方程供其他函数作为输入。我用作测试用例的输出方程是标准二次方程:

Ax^2 + Bx + C

我的目标函数将采用 parameter_vector,看起来像:

parameter_vector = [A, B, C]

并将使用这些指数作为系数来写出我的方程式作为输出。到目前为止,这是我的代码:

def target(parameter_vector):
    pv = parameter_vector
    x = pv[0]*x**2 + pv[1]*x + pv[2]
    return x

我相信你能猜到,我的 shell 中弹出以下错误:

UnboundLocalError: local variable 'x' referenced before assignment

所以我做了一些研究,发现了用于占位变量的 lambda 变量。我试着输入:

x = pv[0]*lambda**2 + pv[1]*x +pv[2]

但是弹出:

File "source_parameters.py", line 7
x = pv[0]*lambda**2 + pv[1]*lambda +pv[2]
               ^
SyntaxError: invalid syntax

我是不是完全错了?我什至确定输出是否应该是一个字符串。任何帮助将不胜感激!

你误解了 lambda 的工作原理;他们从一个表达式创建一个函数。给定 x 作为输入,它看起来像这样:

lambda x: pv[0]*x**2 + pv[1]*x + pv[2]

表达式生成一个函数对象,您可以 return 直接从 target() 函数:

def target(pv):
    return lambda x: pv[0]*x**2 + pv[1]*x + pv[2]

您可以先将 parameter_vector 解压缩为三个组件,以便更清楚地说明您需要在其中包含 3 个值:

def target(parameter_vector):
    a, b, c = parameter_vector
    return lambda x: a * x ** 2 + b * x + c

或者您可以将其概括为 parameter_vector:

的任意长度
def target(parameter_vector):
    return lambda x: sum(p * x ** (len(parameter_vector) - i - 1)
                         for i, p in enumerate(parameter_vector))

快速演示:

>>> lambda x: pv[0]*x**2 + pv[1]*x + pv[2]
<function <lambda> at 0x102a0c6e0>
>>> def target(parameter_vector):
...     a, b, c = parameter_vector
...     return lambda x: a * x ** 2 + b * x + c
... 
>>> new_function = target([3, 2, 5]) # 3x^2 + 2x + 5
>>> new_function
<function <lambda> at 0x102a0c7d0>
>>> new_function(2)
21
>>> new_function(3)
38
>>> new_function(4)
61
>>> def target(parameter_vector):
...     return lambda x: sum(p * x ** (len(parameter_vector) - i - 1)
...                          for i, p in enumerate(parameter_vector))
... 
>>> new_function = target([3, 2, 5])
>>> new_function(2)
21
>>> new_function = target([3, 2, 5, -2])  # 3x^3 + 2x^2 + 5x - 2
>>> new_function(2)
40

你走在正确的轨道上。您可以 return 一个 lambda 函数,如下所示。

def target(pv):
    return lambda i : pv[0]*i*i + pv[1]*i + pv[2]

测试我们确实得到了一个函数

>>> target([1,3,4])
<function target.<locals>.<lambda> at 0x029E8DB0>

让我们将函数分配给f

>>> f = target([1,3,4])

现在我们可以调用带参数的函数了

>>> f(5)
44