【ZZ】Python lambda

a = [(1, 2), (3, 1), (5, 10), (11, -3)]
    Python lambda

Python支持一种有趣的语法,它容许你快速定义单行的最小函数。这些叫作lambda函数,是从Lisp借鉴来的,能够用在任何须要函数的地方。 python

lambda函数也叫 匿名函数,即,函数没有具体的名称。
总的来讲,lambda函数能够 接收任意多个参数而且 返回单个表达式的值。lambda函数不能包含命令, 包含的表达式不能超过一个。不要试图向 lambda函数中塞入太多的东西;若是你须要更复杂的东西,应该定义一个普通函数,而后想让它多长就多长。(固然,太长的函数也是不推荐的)

lambda函数是一种风格问题。不必定非要使用它们;任意可以使用它们的地方,均可以定义一个单独的普通函数来进行替换。通常将它们用在须要封装的特殊的,非重用代码上,避免令代码中充斥着大量的单行函数。 编程

lambda示例:
# 普通函数
def f(x):
    return x*2

>>>f(3)
6

# lambda函数
func = lambda x: x*2
>>>func(3)
6
>>>(lambda x: x*2)(3)
6

为什么使用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))
相关文章
相关标签/搜索