a = [(1, 2), (3, 1), (5, 10), (11, -3)]Python lambda
Python支持一种有趣的语法,它容许你快速定义单行的最小函数。这些叫作lambda函数,是从Lisp借鉴来的,能够用在任何须要函数的地方。 python
lambda函数是一种风格问题。不必定非要使用它们;任意可以使用它们的地方,均可以定义一个单独的普通函数来进行替换。通常将它们用在须要封装的特殊的,非重用代码上,避免令代码中充斥着大量的单行函数。 编程
今天在stackoverflow看到有人提问说Python中为什么使用lambda函数呢?咱们能够从python doc中找到它的使用语法,而且一般我也会被告知能够从函数直接调用lambda函数,显得简洁。可是假若你真的没有真正使用过这个函数,真的很难找到lambda的魅力所在。由于传统编程习惯中,咱们老是为了最求某些简洁而把代码写的很难理解。 函数
咱们来看一个例子:简单的排序,咱们要把: spa
a =[2,1,3]
这里列表逆序排列,即从大到小排序。咱们可使用sorted函数,很简单: code
print sorted(a,reverse=True)
简单的一句就能够搞定了。若是非要在着当中使用lambda函数该如何呢? 对象
print sorted(a,lambda a,b: -cmp(a,b))
这行语句一样达到了效果。可是相比以前的设置reverse=True,后面的lambda….-com(a,b)显得就让人没法理解了。那么lambda函数到底有何用呢,是否是跟普通函数相比仅仅是省去了函数名,因此它一般也被称为“匿名函数”。同时这样的匿名函数,又不能共享在别的地方调用。其实说的没错,lambda在Python这种动态的语言中确实没有起到什么惊天动地的做用,由于有不少 别的方法可以代替lambda。同时,使用lambda的写法有时显得并无那么pythonic。甚至有人提出以后的Python版本要取消 lambda。 blog
回过头来想一想,Python中的lambda真的没有用武之地吗?其实不是的,至少我能想到的点,主要有: 排序
1. 使用Python写一些执行脚本时,使用lambda能够省去定义函数的过程,让代码更加精简。 get
2. 对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不须要考虑命名的问题。 io
3. 使用lambda在某些时候让代码更容易理解。
(上段文字摘自《Python每天美味》)
也许咱们刚才举的例子是用了牛刀来杀机了,有些不合适。接下来看看lambad有些场合能带给你那些便利和惊喜。
补充下基础知识:lambda语句中,冒号前是参数,能够有多个,用逗号隔开,冒号右边的返回值。lambda语句构建的实际上是一个函数对象,见证一下:
>>> a = lambda x: x** 2 >>> print a function <lambda> at 0x029DDE70>
接着举例,对
a = [(1, 2), (3, 1), (5, 10), (11, -3)]
进行排序。咱们分别使用常规自定义函数和lambda函数进行比较,分别为:
def key(x): return x[1] a = [(1, 2), (3, 1), (5, 10), (11, -3)] a.sort(key=key)和
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咱们能够写成
print [x * 2 for x in data]
同样的道理,其余两个函数均可以本身自定义。因此到底用不用lambda函数,自行斟酌。最后附上网上看到python用lambda求阶乘的代码,此次你也许会惊讶些:
print reduce(lambda x,y:x*y, range(1, 1001))