将lambda函数用于依赖于输入

时间:2017-01-11 10:52:40

标签: python lambda

作为输入,我有一个非负整数列表,它应该是多项式的系数。但我也想评估一个数x的多项式。

例如:

如果我们将L=[2,3,1]作为输入,x=42我们得到2x^2+3x+1=3655 我想要的是例如:

>>>p=polynomial([2,3,1])
>>>p(O)
1 
>>>p(42)
>>>3655

我想我必须以某种方式使用lambda函数,并且我知道它对于给定函数的两个变量是如何工作的,但在这种情况下,函数取决于我的输入。

def polynomial(coef):
coef=coef[::-1]
for i in range(len(coef)):
    p=lambda x: coef[i]*x**i
    p+=p
return lambda x: p

这当然是绝对的废话,因为我不能将一个lambda函数加到另一个,但这就是我接近的“直觉”。

非常感谢一些提示。

4 个答案:

答案 0 :(得分:4)

最明显的pythonic解决方案(使用一个带有lambda或(最好是一个名为内部函数)的闭包)已经发布了,但为了完整起见,我将添加其他pythonic解决方案 - 使用一个OO版本自定义可调用类:

class Polynomial(object):
    def __init__(self, coef):
        self.coef = coef

    def __call__(self, x):
        n = len(self.coef) - 1
        return sum(c * x ** (n - i) for (i, c) in enumerate(self.coef))

p = Polynomial([2,3,1])
print p(0)
print p(42)

答案 1 :(得分:2)

简单的Python:

;with
g as (select distinct routeid from RouteTable ),
n as (select 1 n union all select 2 union all select 3 union all select 4 union all select 5 ),
c as (
    select routeid, marker, count(marker) cnt
    from RouteTable 
    group by routeid, marker
),
s as (
    select g.*, n marker, isnull(cnt,0) cnt
    from g
    cross join n
    left join c on c.marker = n.n
)
select routeid, /*count(distinct marker) n_mark, */min(cnt) n_trip
from s
group by routeid

编辑:代码经Mark Dickinson在评论

中修改后修改

答案 2 :(得分:1)

以下lambda函数在给定的x中计算多项式函数,作为coeff系数列表输入:

from functools import reduce

lambda coeff, x: reduce(lambda a, b: a*x + b, coeff)

似乎您想要生成这些多项式函数。您仍然可以使用此方法执行此操作:

def generate_polynomial(coeff):
    return lambda x: (lambda y: reduce(lambda a, b: a*y + b, coeff))(x)

>>> p = generate_polynomial([20,0,17])
>>> p(10)
2017

这仅基于Horner's algorithm

此外,如果您想要专门使用lambda而不使用内置函数,您还可以使用reduce函数模拟lambda。您可能需要查看Python - Removing duplicates in list only by using filter and lambdaRemoving duplicates using only lambda functions,了解如何摆脱filter功能。

答案 3 :(得分:1)

你可以使用lambda:

-i=mi

然而,Lambda不是必需的,你可以在多项式函数中定义另一个函数,如下所示:

def polynomial(coef):
  n = len(coef) - 1
  return lambda x : sum([c * x ** (n - i) for (i, c) in enumerate(coef)])

编辑:以前的输入与3个系数相关