函数式编程:高阶函数
1. 函数式编程
函数式是python内建支持的一种封装,我们通过大段代码拆成函数,通过一层一层的函数调用,就可以把复杂的任务分解成简单的任务,这种分解可以称为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。
函数式编程中,函数可以作为其他函数的输入值,也可以作为返回值,被修改或者分配给一个变量。
函数式编程长期以来在学术界流行,但几乎没有工业应用。造成这种局面的主因是函数式编程常被认为严重耗费CPU和存储器资源[18] ,这是由于在早期实现函数式编程语言时并没有考虑过效率问题,而且面向函数式编程特性,如保证参照透明性等,要求独特的数据结构和算法。[19] -from Wikipedia
函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。 — from 廖雪峰
2. 高阶函数
高阶函数指的是用函数作为参数传输的函数。
先说明几个背景
1、变量名字可以指向函数(意思是函数可以赋值给变量)
# 比如绝对值abs函数,赋值给变量func
func = abs()
# func可以作为函数来给其他的变量作用
>>func(-5)
5
2、函数可以指向变量(意思是可以将变量赋值给函数名)
不推荐这样做,这样相当于把原来函数的作用给覆盖掉了,只有变量的值。
3、传入函数
因为变量可以指向函数,函数的参数可以接收变量。那么把函数作为参数传入到另外一个函数,那么被传入的函数就是高阶函数。
举个例子
def add(x, y, func):
return func(x)+func(y)
>>add(-2, 4, abs)
6
2.1 map/reduce
2.1.1 map()
map(func, iterable_data)
输入两个参数,第一个参数为函数,第二个参数为可迭代(Iterable)的数据。map
的作用是将数据iterable_data
,一个一个的作为参数输入到func
里面。
比如,把这个list所有数字转为字符串:
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
2.1.2 reduce()
reduce(func, list)
,reduce
把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数func
必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算。
比方说对一个序列求和,就可以用reduce实现:
>>> from functools import reduce
>>> def add(x, y):
... return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
2.2 filter
filter
和map
的作用一样,主要是将一个一个元素输入到函数里面,不同的是filter
根据结果是true
或者false
来决定是否保留或丢弃。
所以在设计输入到filter
的函数时,需要考虑返回值是bool
值
2.3 sorted
Python内置的sorted()
函数就可以对list进行排序:
sorted()
函数也是一个高阶函数,它还可以接收一个key
函数来实现自定义的排序,例如按绝对值大小排序:
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]