函数式编程并非在使用Python时须要考虑的首要问题,它的主要做用在于写出更为精确和高效的代码。python
用函数式的风格写代码时,函数应该设计成没有其它反作用,也就是所谓的纯函数:函数接收参数并生成输出而不保留任何状态或修改任何不反映在返回值中的内容。express
# 非函数式 a = 0 def increment1(): global a a += 1 # 函数式 def increment2(a): return a + 1
匿名函数,通常用来给map、filter等服务,即用即扔,或者做为回调函数,传递给某些应用。编程
lambda args: expression
冒号左边是参数,右边是表达式,并将结果做为返回值。函数式编程
map接受一个方法和一个集合做为参数,以集合中的每个元素做为参数传入方法,而后把返回值插入到新建立的集合中,最后返回那个新集合。函数
>>> map(lambda s: s * 2, [1,2,3,4,5])[2, 4, 6, 8, 10]
map也能够接收多个集合做为参数,这个时候,会从多个集合中依次取出对应元素组成元组传递给方法,再将执行结果插入到新的集合中并返回该集合。若是多个集合长度不一致,会以None补上。固然,集合的个数须要与方法参数的个数一致。spa
>>> plus = lambda x,y : (x or 0) + (y or 0) # x or 0 为防止None和0相加出现异常 >>> map(plus, [1,2,3], [4,5,6]) [5, 7, 9] >>> map(plus, [1,2,3,4], [4,5,6]) [5, 7, 9, 4] >>> map(plus, [1,2,3], [4,5,6,7]) [5, 7, 9, 7]
有种状况是传递给map的func方法为None,则从集合中取值的过程依然不变,可是会将取值后的结果直接返回。设计
>> map(None, [1,2,3,4]) [1, 2, 3, 4] >>> map(None, [1,2,3,4], [5,6,7,8]) [(1, 5), (2, 6), (3, 7), (4, 8)] >>> map(None, [1,2,3,4], [5,6,7]) [(1, 5), (2, 6), (3, 7), (4, None)] >>> map(None, [1,2,3,4], [6,7,8,9], [11,12]) [(1, 6, 11), (2, 7, 12), (3, 8, None), (4, 9, None)]
reduce接收的参数形式以下:code
reduce(func, iterable[, initializer])
reduce对iterable可迭代对象中的元素从左到右累计运算,initializer为初始值,若未指定初始值,则将第一个元素做为初始值,从第二个开始迭代。
对象
>>> plus = lambda x, y : x + y >>> reduce(plus, [1,2,3,4,5]) 15 >>> reduce(plus, [1,2,3,4,5], 10) 25
filter一样接收一个方法和可迭代的集合对象做为参数,行为和map相似,可是filter会从方法执行结果中过滤出值为True的结果集并返回。
rem
>>> filter(lambda x: x % 2, [1,2,3,4,5,6,7,8,9,10]) [1, 3, 5, 7, 9]