Python内置函数lambda,map,reduce,filter

适当的使用在Python里的4个内置函数lambda, map, reduce, filter可以使程序变得非常简单易读

lambda运算符

函数形式:

1
lambda argument_list: expression

用lambda开头,然后加上所有需要在函数中使用的元素,中间用逗号隔开。元素后面加冒号,冒号后面加上函数体。

1
2
sum = lambda x, y : x + y
sum(3,4)

7

map()函数

如果把map和lambda结合使用在一起,可以使函数的定义变得更加方便。

函数形式如下:

1
r = map(func, seq)

简单来讲,map函数就是把定义的函数func运用到seq里的每一个元素上。Python2里的map函数直接返回一个list,Python3里的map函数返回一个迭代器,所以如果想要一个数列,要用list()转换迭代器结果。

1
2
3
4
# 摄氏度变华氏度
C = [39.2, 36.5, 37.3, 38, 37.8]
F = list(map(lambda x: (float(9)/5)*x + 32, C))
print(F)

[102.56, 97.7, 99.14, 100.4, 100.03999999999999]

map()函数可以应用到多于一个列表上。每个列表的长度必须一样才能应用到map()函数里,过程是先把函数应用到每个列表的第一个元素上,然后每个列表的第二个元素上,以此类推。

1
2
3
4
a = [1,2,3,4]
b = [17,12,11,10]

list(map(lambda x,y:x+y, a,b))

[18, 14, 14, 14]

filter()函数

filter()函数提供了一种可以方便过滤掉一个数列中不需要的元素的形式。其中的function是一个描述过滤条件的函数,返回值是true或false。过程也是把function函数应用到sequence里的每一个元素上,如果function函数返回true,则这个元素会被去掉。

函数形式如下:

1
filter(function, sequence)

1
2
3
fibonacci = [0,1,1,2,3,5,8,13,21,34,55]
odd_numbers = list(filter(lambda x: x % 2, fibonacci))
print(odd_numbers)

[1, 1, 3, 5, 13, 21, 55]

reduce()函数

正如它的名字,reduce函数将减少数列中的元素个数。func是有两个输入,返回一个值得函数。

函数形式如下:

1
reduce(func, seq)

如果seq= [ s1, s2, s3, ... , sn ],使用reduce(func, seq)过程如下:

  • 第一步先将func运用到数列里前两个元素上[ func(s1, s2), s3, ... , sn ]
  • 第二步将func运用到第一步的结果和数列里前三个元素上[func(func(s1, s2),s3), ... , sn ]
  • 以此类推,直到最后只输出一个元素

1
2
import functools
functools.reduce(lambda x,y: x+y, [47,11,42,13])

113

另外一个例子

1
2
3
from functools import reduce
f = lambda a,b: a if (a > b) else b
reduce(f, [47,11,42,102,13])

102

参考文献

[1]. Python 3 Tutorial https://www.python-course.eu/python3_lambda.php