您的位置:首页 > 编程语言 > Python开发

python lambda函数

2015-12-15 11:56 537 查看
使用一个叫做“lambda”的构造器,Python支持在运行时创建匿名函数(也就是函数并没有绑定一个名字)。这和函数编程语言中的lambda还不是完全一样的,但是这是一个非常强大的概念很好地集成到了Python中,并且经常和典型的函数式概念比如filter(),map()还有reduce()一起结合起来使用。

以下代码片段显示了一个正常的函数定义("f")和一个lambda函数("g")的区别:

>>> def f (x): return x**2
...
>>> print f(8)
64
>>>
>>> g = lambda x: x**2
>>>
>>> print g(8)
64


正如你所看到的,f()和g()所做的完全一样,而且可以可以用相同的方法去使用。注意lambda函数不包含一个“return”语句--它总是包含一个表达式,并且将它返回。你也注意到你可以将一个lambda定义到任何一个期望函数的地方,你根本不需要将它赋给一个变量。

以下的代码片段展示了lambda函数的使用。注意你应该使用Python 2.2或者更新的版本,为了支持嵌套的范畴(nested scope)。

>>> def make_incrementor (n): return lambda x: x + n
>>>
>>> f = make_incrementor(2)
>>> g = make_incrementor(6)
>>>
>>> print f(42), g(42)
44 48
>>>
>>> print make_incrementor(22)(33)
55


以上代码定义了一个“make_incrementor”的函数,该函数在运行时创建了一个匿名函数并将它返回。返回的函数增加它的参数到它创建时指定的值上。

你现在可以创建多个不同的增量函数并将它们赋给一个变量,然后独立地使用它们。就像最后一个语句展示的那样,你甚至根本不需要在任何地方将整个函数赋值--你可以立即使用它,但你不再需要他的时候你可以忘了他。

以下的部分更进了一步。

>>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
>>>
>>> print filter(lambda x: x % 3 == 0, foo)
[18, 9, 24, 12, 27]
>>>
>>> print map(lambda x: x * 2 + 10, foo)
[14, 46, 28, 54, 44, 58, 26, 34, 64]
>>>
>>> print reduce(lambda x, y: x + y, foo)
139


首先我们定义了一个简单的整型值的列表,然后我们使用了标准函数filter(),map()和reduce()去做不同的事情。所有的三个函数都期待两个参数:一个函数和一个列表。

当然,我们可以在其它地方定义一个单独的函数,然后使用这个函数的名字作为filter()等函数的参数,实际上这确实是一个好主意如果我们想要使用这个函数好多次,或者这个函数写在一行会太复杂。但是,如果我们只是用它一次那就很简单了(也就是说它只包含了一个表达式,像上面的例子那样),更方便的是使用一个lambda构造去产生一个(临时的)匿名函数,并将它立即传到filter()里。这样创建了非常紧凑,并且可读的代码。

在第一个例子中,filter()调用我们的lambda函数作用于列表中的每一个元素,并且返回一个新的列表,该列表包含使这个函数返回“真”的元素。这个例子中,我们得到了所有为3的整数倍的元素。表达式x % 3 == 0 计算x被3除的余数并将它和0比较。

第二个例子中,map()用来转换我们的列表。指定的函数会调用原来的列表中的每一个元素,并创建一个新的元素包含我们的lambda函数的返回值。在这个例子中,它对每个元素计算2 * x + 10.

最后,reduce()函数有一些特殊。该函数的“worker function”必须接受两个参数(我们称之为x和y),并不是一个参数。这个函数调用列表中的前两个参数,然后调用返回值与第三个元素,等等,直到列表中的元素被遍历完全。这就意味着我们的函数被调用了n-1次,如果这个列表包含n个元素的话。最后一次调用的返回值就是reduce()构造的结果。从上面的例子中看出,它简单地叠加了参数,所以我们得到了所有参数的和。

原文链接:这里

你先爱可以创建多个不同的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: