python lambda函数

来源:互联网 发布:pump it up 编辑:程序博客网 时间:2024/06/15 17:29

使用一个叫做“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()构造的结果。从上面的例子中看出,它简单地叠加了参数,所以我们得到了所有参数的和。




原文链接:这里

你先爱可以创建多个不同的

0 0
原创粉丝点击