我正在开发一个需要一个函数的项目(我称之为目标),它将获取一个名为parameter_vector的输入,并输出一个其他函数的等式作为输入。我用作测试用例的输出方程是标准二次方程:
Ax^2 + Bx + C
我的目标函数将采用一个如下的参数_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
我接近这个完全错了吗?我确定输出应该是否为字符串。任何帮助将不胜感激!
答案 0 :(得分:2)
你误解了lambdas是如何工作的;他们从表达式创建一个函数。给定x
作为输入,看起来像这样:
lambda x: pv[0]*x**2 + pv[1]*x + pv[2]
表达式生成一个函数对象,您可以直接从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
答案 1 :(得分:2)
你走在正确的轨道上。您可以按如下方式返回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