Python中的回调函数
概念解释
先来看一个程序:
def f1(): print(2) return 1 def f2(a): print(3) return a print(f2(f1()))
这个程序,在调用时,f2会先等待f1调用完毕,返回1之后,再进行调用,所以会输出2、3、1,但是若这样改写程序
def f1(): print(2) return 1 def f2(f): print(3) return f() print(f2(f1))
这里我们会发现,给f2传的实参从f1()变成了f1,那这两有什么区别呢?简单来说就是:
1. f1()表示调用函数,并返回结果
2. f1仅仅表示这个函数对象,并不执行函数调用
那这里就涉及到一个关键的点了,在Python中,一切皆为对象,当然,函数也不例外。所以f1实际上是表示这个函数的对象,当我们print(f1)的时候,会输出这个对象所在的地址。
那么,既然把它作为一个对象来看待,那么它和数字、字符串等标准对象其实就无本质差异了,所以,一个函数可以作为:
1. 可以作为被引用的对象
2. 可以作为类型容器的元素
3. 可以作为参数传给另一个函数
4. 可以作为函数的返回值
在上面那个程序中,把f1作为对象(也就是f1的地址)传给了f2,f2会执行到return 语句的时候,才会调用f1,所以输出结果为3、2、1。由此,可以引出回调函数的定义:
把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,这就叫做回调。
简单应用
回调函数最大的优点就是能降低耦合度,提高程序灵活性,很多Python的内置函数都使用了回调的思想,例如max(),map(),sorted()等,都可以使用回调函数来自定义规则。举个例子:
def addition(a, b): return a + b def multiplication(a, b): return a * b def func(fn, *nums): a, b = nums return fn(a, b) print(func(addition, 1, 2)) print(func(multiplication, 1, 2))
这里定义了两个函数,addition和multiplication,分别处理加法和乘法,而func对这两个函数进行了回调,这样,就可以实现选择不同的函数,来实现不同的功能了。