函数式编程是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。Python对函数式编程提供部分支持,由于Python允许使用变量,因此,Python不是纯函数式编程语言。
函数式编程的一个特点就是,允许把函数本身作为参数(见下文一、高阶函数)传入另一个函数,还允许返回一个函数(见下文二、返回函数)!
一、高阶函数(函数作为参数)
1.什么是高阶函数?
一个函数接收另一个函数作为参数,这种函数称之为高阶函数。
#高阶函数
>>> def add(x,y,f):
... return f(x)+f(y)
...
>>> add(-1,1,abs)
2
解析:当调用add(-1,1,abs)时,参数x,y和f分别接收-1,1,abs,根据函数定义,计算过程为:
x = -1
y = 1
f = abs
f(x)+f(y)==>abs(x)+abs(y)==>2,即return 2
2.内置高阶函数——map/reduce
map()函数接收两个参数,一个是函数,一个是可迭代对象(Iterable),map将传入的函数依次作用到序列的每个元素,并把结果作为新的迭代器(Iterator)返回。
例如将函数作用在列表[1,2,3,4,5,6,7,8,9]上,用map()实现如下:
f(x) = x * x
│
│
┌───┬───┬───┬───┼───┬───┬───┬───┐
│ │ │ │ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
[ 1 2 3 4 5 6 7 8 9 ]
│ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
[ 1 4 9 16 25 36 49 64 81 ]
#方法一:map()函数实现f(x)=x*x
>>> def f(x):
... return x*x
...
>>> m = map(f,[1,2,3,4,5,6,7,8,9])
>>> list(m)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
解析:map()传入的第一个参数是f,即函数对象本身,把f作用在list的每一个元素并把结果生成一个新的list。由于结果m是一个迭代器,迭代器是惰性序列&