使用一个叫做“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
以下的代码片段展示了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
你现在可以创建多个不同的增量函数并将它们赋给一个变量,然后独立地使用它们。就像最后一个语句展示的那样,你甚至根本不需要在任何地方将整个函数赋值--你可以立即使用它,但你不再需要他的时候你可以忘了他。
以下的部分更进了一步。
>>> 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()等函数的参数,实际上这确实是一个好主意如果我们想要使用这个函数好多次,或者这个函数写在一行会太复杂。但是,如果我们只是用它一次那就很简单了(也就是说它只包含了一个表达式,像上面的例子那样),更方便的是使用一个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()构造的结果。从上面的例子中看出,它简单地叠加了参数,所以我们得到了所有参数的和。
原文链接:这里
你先爱可以创建多个不同的