sorted()、map()、filter()、reduce() 中的匿名函数:lambda
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 循环,列表推导式)的性能,效率是更优的。
上一篇:
IDEA上Java项目控制台中文乱码