函数式编程就是对一个序列应用一些函数工具。在Python中,reduce、map、filter都是函数式编程工具。
一、lambda表达式
lambda只是一个表达式,函数体比def简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda表达式是起到一个函数速写的作用。允许在代码内嵌入一个函数的定义。
例子1:定义了一个lambda表达式,求三个数的和。
例子2:用lambda表达式求n的阶乘。
二、map函数
map函数应用于每一个可迭代的项,返回的是一个结果list。如果有其他的可迭代参数传进来,map函数则会把每一个参数都以相应的处理函数进行迭代处理。map函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
格式
map(func, seq1[, seq2...] )
map可以使用任何的lambda函数操作,本质上是把原有的list根据lambda法则变成另外一个list,例子如下:
l = [1,2,3]
new_list = list(map(lambda i: i+1, l))
print(new_list)
# Py3里,外面需要套个list:这是为了让里面的值给显示出来,要不然你会得到这是个map函数而不是里面的值。Py2的童鞋不需要
# 我们也可以把两个数组搞成一个单独的数组
l2 = [4,5,6]
new_list = list(map(lambda x,y: x+y, l, l2))
print(new_list)
三、reduce函数
reduce函数也是Python内置的一个高阶函数。在python 3.0.0以后, reduce已经不在built-in function里了, 要用它就得在文件开头写入
from functools import reduce
reduce函数接收的参数和map类似,一个函数f,一个list,但行为和 map不同:reduce传入的函数 f ,必须接收两个参数,reduce对list的每个元素反复调用函数f,并返回最终结果值。
例如,编写一个f函数,接收x和y,返回x和y的和:
def f(x, y):
return x + y
调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:
先计算头两个元素:f(1, 3),结果为4;
再把结果和第3个元素计算:f(4, 5),结果为9;
再把结果和第4个元素计算:f(9, 7),结果为16;
再把结果和第5个元素计算:f(16, 9),结果为25;
由于没有更多的元素了,计算结束,返回结果25。
上述计算实际上是对list的所有元素求和。虽然Python内置了求和函数sum(),但是利用reduce求和也很简单。
reduce还可以接收第3个可选参数,作为计算的初始值。
如果把初始值设为100,计算:
reduce(f, [1, 3, 5, 7, 9], 100)
结果将变为125,因为第一轮计算是:计算初始值和第一个元素:f(100, 1),结果为101。
四、filter函数
filter函数可以对序列做过滤处理,就是说可以使用一个自定义的函数过滤一个序列,把序列的每一项传到自定义的过滤函数里处理,并返回结果做过滤。最终一次性返回过滤后的结果。 和map类似,filter也接收一个函数和一个序列。和map不同的时,filter把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
语法
filter(func, seq)
例子
l = [100, 20, 24, 50, 110]
new = list(filter(lambda x: x<50, l))
#py3得套个list来转化,便于打印出来
print(new)
熟练运用以上三个玩意儿,你就可以一行写出几乎所有的复杂计算了。