Python的lambda表达式
Lambda 是一种匿名函数,它通过表达式来构建函数功能,提高表达式的灵活性。lambda 表达式最早出现在函数式编程语言中,Python 中的lambda 表达式就是借鉴 Lisp的。
我们在使用 def 创建一个函数时,是需要给定一个函数名的。而lambda在构建类似功能时,不用取名,所以也叫匿名函数。当然,lambda 所实现的功能仅限于用一个表达式来构建。因此,它要比通过 def 定义的函数功能复杂度上更简单,从可读性上来讲,一个表达式要定义的功能也是有限的。
比如:
>>> count = lambda x, y: x+y >>> count(3, 4) 7
我们如果通过 def定义函数来实现的话:
>>> def count(x, y): >>> return x + y >>> count(3, 4) >>> 7
上面的lambda 表达式实现两个变量相加的功能,并把它赋值给一变量来调用。当然,这种情况也不是必须的,我们还可以省去给变量赋值,直接调用lambda表达式:
>>> (lambda x: x*2) (9) 18
使用 lambda的一个主要原因在于,它让代码看上去更简洁,特别是在和其他一些内建函数配合使用时:
>>> lst = [2, 4, 18, 22, 9, 30, 27] >>> filter (lambda x: x%3 == 0, lst) [18, 9, 30, 27] >>> map (lambda x: x*2 + 10, lst) [14, 18, 46, 54, 28, 70, 64] >>> reduce (lambda x, y: x+y, lst) 112
上面的代码如果不使用lambda和内建函数,同样可以实现其功能。但是,代码看上去就会显得冗长。而简洁正是Python一大特性,我们有责任让代码保持简洁。
但是,事情总有两面。过于追求简洁的后果,就是可读性差。如果把一个表达式或语句写的过于“简洁”,恐怕也不是什么好事,比如两名都是用一条语句来打印九九乘法表:
>>> print '\n '.join(map(lambda x: ' '.join(map(lambda y: "%s x %s = %s " % (x, y, x * y), range(1,10))), range(1,10))) >>> print '\n '.join([ ' '.join([ "%s x %s=%s" %(x,y,x*y) for y in range(1,x+1)]) for x in range(1,10)])
上面语句的“凌乱”程度,让我望而却步。至少我不会追求这种简洁性,宁愿老老实实地写个函数来实现,起码可读性要好很多。
总结:
1. 任何lambda 表达式,都可以通过 def 定义函数的方式来实现;
2. lambda 表达式在与某些函数配合使用时,可以增加代码的灵活性和简洁性;
3. 不滥用lambda表达式,如果lambda 表达式过于复杂,请使用 def定义函数来实现它。
浙公网安备 33010602011771号