- 函数式编程就是一种抽象程度很高的编程范式。(Python允许使用变量,不是纯函数式编程语言)
- 函数式编程的特点:函数可以赋给变量,所以,可作为参数传递,可作为返回值返回。
一个最简单的高阶函数:
1 def add(x, y, f):
2 return f(x) + f(y)add(-5, 6, abs) ,
abs
作为参数传入 add 函数中 ,又作为参数返回
作为参数
一个列表运算的例子:lst = range(5)
加法:只需 for 循环遍历 lst ,依次相加,返回 amout
1 amount = 0
2 for num in lst:
3 amount = add(amount, num
1 def sum_(lst):
2 amount = 0
3 for num in lst:
4 amount = add(amount, num)
5 return amount
6
7 print sum_(lst)
1 def sum_(lst):
2 amount = 0
3 for num in lst:
4 amount = add(amount, num)
5 return amount
6
7 print sum_(lst)
乘法:初始值换成了1以及函数add换成了乘法运算符
1 def multiply(lst):
2 product = 1
3 for num in lst:
4 product = product * num
5 return product
把这个流程抽象出来,而将加法、乘法或者其他的函数作为参数传入:
1 def reduce_(function, lst, initial):
2 result = initial
3 for num in lst:
4 result = function(result, num)
5 return result
现在,想要算乘积:
1 print reduce_(lambda x, y: x * y, lst, 1)
返回闭包
闭包是一类特殊的函数。如果一个函数定义在另一个函数的作用域中,并且函数中引用了外部函数的局部变量,那么这个函数就是一个闭包。
可变参数的求和:
1 def calc_sum(*args):
2 ax = 0
3 for n in args:
4 ax = ax + n
5 return ax
返回求和的函数:
1 def lazy_sum(*args):
2 def sum():
3 ax = 0
4 for n in args:
5 ax = ax + n
6 return ax
7 return sum
调用lazy_sum()
时,返回的并不是求和结果,而是求和函数
1 >>> f = lazy_sum(1, 3, 5, 7, 9)
2 >>> f
3 <function sum at 0x10452f668>
4 >>> f()
5 25
在函数lazy_sum
中又定义了函数sum
,并且,内部函数sum
可以引用外部函数lazy_sum
的参数和局部变量,当lazy_sum
返回函数sum
时,相关参数和变量都保存在返回的函数中,称为闭包
需要注意的问题是,返回的函数并没有立刻执行,而是直到调用了 f()
才执行。我们来看一个例子:
1 def count():
2 fs = []
3 for i in range(1, 4):
4 def f():
5 return i*i
6 fs.append(f)
7 return fs
8
9 f1, f2, f3 = count()
1 >>> f1()
2 9
3 >>> f2()
4 9
5 >>> f3()
6 9
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如果一定要引用循环变量怎么办?方法是再创建一个函数
1 >>> def count():
2 ... fs = []
3 ... for i in range(1, 4):
4 ... def f(j):
5 ... def g():
6 ... return j*j
7 ... return g
8 ... fs.append(f(i))
9 ... return fs