努力不一定成功但放弃就一定失败
分类: Python/Ruby
2012-11-21 15:56:02
今天看到lambda函数时,对它的使用不是很清楚,于是上网查了查,看到了这篇文章,和大家分享:
本文转自:
我们来看一个例子:简单的排序,我们要把:
1 | a =[2,1,3] |
这里列表逆序排列,即从大到小排序。我们可以使用sorted函数,很简单:
1 | print sorted(a,reverse=True) |
简单的一句就可以搞定了。如果非要在着当中使用lambda函数该如何呢?
1 | print sorted(a,lambda a,b: -cmp(a,b)) |
这行语句同样达到了效果。但是相比之前的设置reverse=True,后面的lambda….-com(a,b)显得就让人无法理解了。那么lambda函数到底有何用呢,是不是跟普通函数相比仅仅是省去了函数名,所以它通常也被称为“匿名函数”。同时这样的匿名函数,又不能共享在别的地方调用。其实说的没错,lambda在Python这种动态的语言中确实没有起到什么惊天动地的作用,因为有很多 别的方法能够代替lambda。同时,使用lambda的写法有时显得并没有那么pythonic。甚至有人提出之后的Python版本要取消 lambda。
回过头来想想,Python中的lambda真的没有用武之地吗?其实不是的,至少我能想到的点,主要有:
1. 使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。
2. 对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。
3. 使用lambda在某些时候让代码更容易理解。
(上段文字摘自《Python天天美味》)
也许我们刚才举的例子是用了牛刀来杀机了,有些不合适。接下来看看lambad有些场合能带给你那些便利和惊喜。
补充下基础知识:lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值。lambda语句构建的其实是一个函数对象,见证一下:
>>> a = lambda x: x** 2 >>> print a function接着举例,对
1 | a = [(1, 2), (3, 1), (5, 10), (11, -3)] |
进行排序。我们分别使用常规自定义函数和lambda函数进行比较,分别为:
1 2 3 4 5 | def key(x): return x[1] a = [(1, 2), (3, 1), (5, 10), (11, -3)] a.sort(key=key) |
和
1 2 | a = [(1, 2), (3, 1), (5, 10), (11, -3)] a.sort(key=lambda x: x[1]) |
这里很明显省去了某些函数的定义。但是前提你要明白lambda的工作原理。还有lambda还可以跟python的filter,map以及reduce函数结合使用,达到某种计算要求。
>>> data = [1,2,3,4,5] >>> print filter(lambda x : x % 2 ==0,data) [2, 4] >>> print map(lambda x:x *2,data) [2, 4, 6, 8, 10] >>> print reduce(lambda x,y: x+y, data) 15当然也不是非要用lambda函数不可,前面的map我们可以写成
1 | print [x * 2 for x in data] |
一样的道理,其他两个函数都可以自己自定义。所以到底用不用lambda函数,自行斟酌。最后附上网上看到python用lambda求阶乘的代码,这次你也许会惊讶些:
1 | print reduce(lambda x,y:x*y, range(1, 1001)) 绿色部分的代码,详细解释,链接如下:http://ipie.blogbus.com/logs/23243382.html |