Python:采用参数输入和返回输出方程

时间:2015-01-12 21:43:58

标签: python function

我正在开发一个需要一个函数的项目(我称之为目标),它将获取一个名为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

我接近这个完全错了吗?我确定输出应该是否为字符串。任何帮助将不胜感激!

2 个答案:

答案 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