Python 高阶函数
Python 高阶函数
什么是高阶函数:
高阶函数就是能够接收
函数对象
作为参数的函数。
比如:
def higher_func(arg_func):
print 'in higher func'
return arg_func
def func():
print 'hello world'
x = higher_func(func)
x()
上段代码的执行结果为:
in higher func
hello world
为什么会这样呢,要解释清楚就需要从基础慢慢的来了~
变量可以指向函数
首先,我们要知道。在Python中,变量可以指向函数对象,这就可以做很多好玩的东西。比如说:
>>> abs(10) // 调用内置的求绝对值的函数
10
>>> abs // 查看函数对象本身,可见`abs(10)`是函数对象调用,而`abs`作为函数名指向函数对象本身
<built-in function abs>
>>> f = abs // 把函数对象赋值给变量f
>>> f
<built-in function abs>
>>> f(10) // 通过变量去调用函数
10
经过上面的折腾就能看到变量f
其实是指向了一个函数对象,通过它也能够调用函数对象,效果和函数名调用对象相同。
函数名也是变量
变量名可以指向函数对象,那么函数名是不是也只是一个变量呢,是不是也可以指向其他的函数对象呢,我们来试一下:
>>> f = abs
>>> abs = len // 让`abs`这个函数名不在指向绝对值函数对象,重新指向`len`函数对象
>>> abs // `abs`已经改变
<built-in function len>
>>> len
<built-in function len>
>>> abs(10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()
>>> f // 变量f依然指向的是绝对值函数对象
<built-in function abs>
>>> f(10)
10
高阶函数
这样就能解释开头的代码了:
# 定义一个函数对象
def higher_func(arg_func):
print 'in higher func'
return arg_func
# 定义另外一个函数对象
def func():
print 'hello world'
# 将函数func的对象作为参数传给higher_func,返回的依然是func的对象本身,并且顺带之行了higher_func内的打印语句
x = higher_func(func)
# x被赋值为func对象,x()调用该对象
x()
这里的higher_func
便是一个高阶函数。再来一个例子:
def add(x, y, func):
return func(x) + func(y)
x = add(-4, 6, abs)
print x // 执行的是abs(-4) + abs(6) = 10
高阶函数总结
高阶函数的概念并不仅仅在Python才有,JavaScript、PHP甚至C/C++中都能够遇到高阶函数
JavaScript中大量的使用了高阶函数,PHP的使用闭包也会遇到高阶函数。
C/C++中使用指针和函数指针也会遇到高阶函数