python中的map,reduce,filter函数和lambda表达式
python中的map,reduce,filter函数和lambda表达式
首先看几个栗子:
map(lambda a : a > 3, a)
Out[22]: [False, False, False, True, True]
filter(lambda a : a > 3, a)
Out[23]: [4, 5]
reduce(lambda a : a > 3, a)
Traceback (most recent call last):
File "<ipython-input-24-2c40571c49c9>", line 1, in <module>
reduce(lambda a : a > 3, a)
TypeError: <lambda>() takes exactly 1 argument (2 given)
reduce(lambda a,b : a + b , a)
Out[25]: 15
好,由这几个例子开始介绍。
首先介绍lambda表达式,因为前面的例子中都有一个lambda表达式。lambda表达式的作用是将函数用一种简单的方式进行定义,比如:
lambda x : x*x
lambda x, y : x + y
lambda x, y : x > y
等等,冒号前面的是传入的参数,后面是执行的操作,返回的就是操作的结果。由于形式简单,所以也只能表达有限的函数类型。但是这种表示方法可以是函数显得非常简洁。比如:
lambda x : x * x
# 等价于
def func(x):
return x * x
尤其是在某个函数可能仅仅使用一次的情况下,这样做更好。lambda表达式常常与下面的map,reduce,filter等一起操作,作为他们的参变量传入,起到用简洁的语句完成对某个list数据的处理工作。
下面介绍map,reduce,以及filter。
首先介绍map函数,map 是python中的一个内置的函数,它表示“将某个函数作用于某个list的每个元素身上”。由此也可以知道,我们的map函数需要两个参数:一个是定义好的函数,一个是list。要做到这一点,可以想到,map第一个参数,也就是函数,应该是以后面list的元素的类型作为输入参变量类型的。比如,上面的第一个栗子中,我们定义的是一个判断语句的函数,返回值就是 (a>3) ,这是一个布尔值,所以得到的结果是对每个元素做一个是否大于3的判断,结果为[False, False, False, True, True]。
而filter则是按照某个规则,将符合规则的留下,其余删除。比如第二个栗子。
reduce是对list的数据进行一个连续的操作,它的函数应当是双目运算符,比如第三个栗子中,只给了一个参数,那么就会导致TypeError: () takes exactly 1 argument (2 given)的报错,也就是我们的 lambda表达式只接受一个arg,但是给了两个。这两个就是reduce操作给的,也就是说,每次reduce都要顺次地在list中选两个进行操作,之后放回去,在进行操作,一个简明的解释就是:
reduce(f(a,b), nums) = f(...f(f(nums[0],nums[1]),nums[2]),...,nums[-1])
所以可以用它来实现连乘和连加求和等操作。
另外,注意到,map函数的那个函数参数可以是现成的函数,比如str,就是把每个元素变成string类型:
a
Out[28]: [1, 2, 3, 4, 5]
map(str, a)
Out[29]: ['1', '2', '3', '4', '5']
2018年03月29日23:34:38