Python 中的匿名函数的关键字是 lambda
,之后是一系列的参数,然后用冒号隔开,最后则是由这些参数组成的表达式。我们通过几个例子看一下它的用法:
>>> sqr = lambda x: x**2
>>> sqr(3) # 9
对应的常规 def
函数这样定义:
>>> def sqr(x):
return x**2
>>> sqr(3) # 9
可以看到,匿名函数 lambda
和常规函数一样,返回的都是一个函数对象(function object)。
Python 主要提供了这么几个函数:sorted()
、map()
、filter()
和 reduce()
,它们通常结合匿名函数 lambda
一起使用。
-
因为
lambda
表达式可以用在列表推导式中:>>> [(lambda x: x*x)(x) for x in range(10)] >>> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
-
lambda
作为sorted()
函数的参数>>> s = [('w', 1), ('a', 3), ('c', 6)] >>> s.sort(key=lambda x: x[1]) # 按列表中元组的第二个元素排序 >>> print(s) >>> [('w', 1), ('a', 3), ('c', 6)] >>> s_ = sorted(s, key=lambda x: x[0]) # 按列表中元组的第一个元素排序。sorted()不会改变 s本身 >>> print(s_) >>> [('a', 3), ('c', 6), ('w', 1)]
-
lambda
作为map()
函数的参数map(function, iterable)
函数表示,对 iterable 中的每个元素,都运用 function 这个函数,最后返回一个迭代器可供遍历。比如刚才列表的例子,要对列表中的每个元素乘以 2,那么用map
就可以表示为下面这样:>>> s = [1, 2, 3, 4, 5] >>> list(map(lambda x: x**2, s)) # map()返回的是一个可迭代对象 >>> [1, 4, 9, 16, 25]
-
lambda
作为filter()
函数的参数filter(function, iterable)
函数和map
函数类似,function
同样表示一个函数对象。filter()
函数表示对iterable
中的每个元素,都使用function
判断,并返回True
或者False
,最后将返回True
的元素组成一个迭代器可供遍历。举个例子,比如我要返回一个列表中的所有偶数,可以写成下面这样:
>>> s = [1, 2, 3, 4, 5] >>> list(filter(lambda x: x % 2 == 0, s)) >>> [2, 4]
-
lambda
可以作为reduce()
函数的参数reduce(function, iterable)
函数通常用来对一个集合做一些累积操作。function
同样是一个函数对象,默认接收两个参数,表示对iterable
中的每个元素以及上一次调用后的结果运用function
进行计算,所以最后返回的是一个单独的数值。举个例子,我想要计算某个列表元素的乘积,就可以用
reduce()
函数来表示:>>> from functools import reduce # python3 之后 reduce 函数放在了这 >>> s = [1, 2, 3, 4, 5] >>> reduce(lambda x, y: x * y, l) # 1*2*3*4*5 = 120 >>> 120
当然,
filter()
和reduce()
的功能,也可以用 for 循环或者列表推导式来实现。通常来说,在我们想对集合中的元素进行一些操作时,如果操作非常简单,比如相加、累积这种,那么我们优先考虑
map()
、filter()
、reduce()
这类或者列表推导式的形式。
Python 中的匿名函数 lambda
,它的主要用途是减少代码的复杂度。需要注意的是 lambda
是一个表达式,并不是一个语句;它只能写成一行的表达形式,语法上并不支持多行。匿名函数通常的使用场景是:程序中需要使用一个函数完成一个简单的功能,并且该函数只调用一次。
map()
、filter()
和 reduce()
三个函数比其他形式(for 循环,列表推导式)的性能,效率是更优的。