函数式编程学习笔记

一、命令式编程和函数式式编程的区别

命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。而函数式编程的思想是告诉计算机应该做什么,但不指定具体要怎么做。代码更加简洁、易理解、易维护、易并行。函数式编程最重要的特点是“函数第一位”,即函数可以出现在任何地方,比如可以把函数作为参数传递给另一函数,还可以将函数作为返回值。
尽管python算不上一门纯函数式编程语言,但它本身提供了很多函数式编程的特性,像map、reduce、filter这些函数都支持函数作为参数。

二、lambda表达式

lambda表达式在其他语言中被称为匿名函数。即函数没有具体的名称。比如普通函数用def创建的方法是有名称的,而lambda创建时没有名字,如果你不需要对一个函数使用两次,可以使用lambda表达式。

#普通函数
def add(a,b):
    return a + b
print add(2,3)

#匿名函数 冒号前是参数,可以有多个,用逗号隔开,冒号右边只能是表达式
add = lambda a,b : a + b
print add(2,3)

通过以上的例子,非常容易理解lambda简化了函数定义的书写格式,使代码更为简洁,但是使用普通函数的定义方式更为直观,易理解。

三、map()

一般用法是map(function, *iterables)。需要传入一个函数,这个函数可以是内置的,也可以是自己定义,也可以是匿名函数。
第二个参数是一个可迭代对象(可以传入多个),如列表,字符串等等,如果传入的多个迭代对象长度不一致,则按最短的长度进行处理。
返回的是一个map对象,注意不是列表不能直接输出,可以通过for循环或者list()来显示。

list_x=[1,3,4,5]
list_y=[1,5,6,7,8]
r=map(lambda x,y:x+y,list_x,list_y)
print(list(r))

四、reduce()

reduce()函数在库functools里,如果要使用它,要从这个库里导入。
一般用法是reduce(function, sequence[, initial])。需要传入一个函数,这个函数可以是内置的,也可以是自己定义,也可以是匿名函数,function参数是一个有两个参数的函数,reduce依次从sequence中取一个元素,和上一次调用function的结果做参数再次调用function。
第一次调用function时,如果提供initial参数,会以sequence中的第一个元素和initial作为参数调用function,否则会以序列sequence中的前两个元素做参数调用function。
reduce函数与map函数不一致的地方,map函数操作是并行操作,reduce函数是把多个参数合并的操作,也就是从多个条件简化的结果。

from functools import reduce
 list_z=[1,2,3,4,5,6]
 r=reduce(lambda z,z1:z+z1,list_z)
 print(R)

五、filter()

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
一般用法filter(function, iterable)第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

 list_f=[1,0,1,1,0]
 F=filter(lambda x:x,list_f)
 print(list(F))

你可能感兴趣的:(函数式编程学习笔记)