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
我正在开发一个项目,该项目需要一个函数(我将其称为目标),该函数接受一个名为 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