python lambda函数

首先说一下什么是lambda函数。 lambda函数是python中的一种定义函数的方法(当然在很多其它语言中,比如lisp也有)。通过lambda定义的函数,没有函数名。比如下面的代码:

>>> lambda x: x*x
<function <lambda> at 0x2ae456263938>

这段lambda代码只是返回了一个函数对象的指针(姑且这么理解吧)。 lambda 后面跟的是该函数的参数列表,这里是一个 x. 而 " : " 后面跟的是函数体。 这一段代码的意识是创建一个函数,该函数接受一个参数并返回其平方。  这段代码创建了一个函数对象后,这个函数对象没有被任何人引用,所以在这段代码结束后,这个对象的引用就为0了,这个函数就消失了。如果你像下面这样

>>> a= lambda x:  x*x

你就对这个函数对象做了一次引用,并把引用保存到了a中。这时a就是这个函数的一个别名了。你可以像普通函数一样用它。比如:

>>> a(22)
484

 

OK.相信你已经很清楚lambda 的语法以及其作用了。但是你一定还觉得很迷惑,因为你不知道它存在的意义。 我们已经非常熟悉函数的意义了,那就是把一段逻辑抽象化,这样在变成的时候就不用把那些常用的逻辑复制的到处都是了。可是没有名字的函数有什么意义呢?

其实很有意义。 函数的意义在于抽象化,不用大量的复制代码,但是有一个潜在的问题是,理解抽象的东西需要一定的精力。 比如你在阅读代码的时候看到一个函数不是很熟悉,那么你通常就要去看一下这个函数的定义以及作用。如果这个函数是大量使用的,那没办法,只能这么做了,付出一点精力去了解这个函数总比让这个函数的代码被解开复制的到处都是要好。 但是如果这个函数你压根儿只用一次呢? 如果这个函数的定义非常简单呢? 那么这时候我想你更倾向于直接看函数的定义而不是看到函数名字之后再去查看函数的代码。 请看下面的例子:

>>> map( lambda x: x*x, [y for y in range(10)] )

这段代码一目了然非常清晰。 这是因为你用了lambda的原因。如果你不用lambda,这段代码应该这么写:

>>> def sq(x):
...     return x * x
...
>>> map(sq, [y for y in range(10)])

ok, 当你看到map这里调用的时候,你一定需要去查一下sq到底是个什么函数。如果sq是一个大量使用的函数也好,也许你已经记住了,可如果sq只在这里用一次,那么这种写法就显得不简洁了,而且sq的定义就可以说是一个多余的垃圾了。

再看一个更极端一点的:

>>> map(sq,a)

如果你看到上面这一段代码,你明白它是什么意思吗? 肯定不能明白,你只能知道sq应该是个函数 a应该是个sequence。 这时你需要去查看sq的定义和a的定义,然后发现是这样的

>>> def sq(x):
...     return x*x
...
>>> a=[1,2,3]
>>>
>>>
>>> map(sq,a)
[1, 4, 9]

oh 这太麻烦了。如果用lambda的话,map(sq,a)就可以写成下面这样

>>> map(lambda x:x*x, [1,2,3])

是不是一目了然。

 

总而言之,函数的目的是为了抽象,那么lambda的用处,就可以简单的理解为具化。如果没有lambda那么抽象可能就会被滥用,lambda就是帮助解决这种问题的。

posted on 2014-04-03 14:35  kramer  阅读(574)  评论(0编辑  收藏  举报

导航