Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251967
  • 博文数量: 40
  • 博客积分: 713
  • 博客等级: 军士长
  • 技术积分: 437
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-06 19:16
个人简介

努力不一定成功但放弃就一定失败

文章分类

全部博文(40)

文章存档

2012年(32)

2011年(8)

分类: 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 at 0x029DDE70>

接着举例,对

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
阅读(2812) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~