函数式编程就是对一个序列应用一些函数工具。在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 reducereduce函数接收的参数和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)熟练运用以上三个玩意儿,你就可以一行写出几乎所有的复杂计算了。
新闻热点
疑难解答