雪花飘落

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对这两个函数进行了回调,这样,就可以实现选择不同的函数,来实现不同的功能了。

 

posted @ 2024-01-20 16:08  haruyuki  阅读(143)  评论(0编辑  收藏  举报