Python 中的回调函数 – 完整概述

回调是Python以及Javascript、C等其他语言中的一个通用概念。我们知道Python是一种面向对象的语言,函数是Python中的一等对象。这意味着,在Python中,我们可以将函数返回的值分配给变量,并从另一个函数返回一个函数。

在本教程中,我们将了解 Python 编程语言中回调的概念,并且还将看到一些与之相关的示例。那么让我们开始吧。

Python 中的回调函数

当一个函数被另一个函数调用时,它被称为回调。回调函数是作为参数传递给另一个函数的函数。可以通过两种方式完成:

  1. 将一个函数作为参数传递给另一个函数
  2. 在另一个函数内部调用一个函数

以上两点可以帮助您确定给定函数是否是回调函数。一个函数不一定要同时满足上述两个条件才能成为回调函数。即使满足上述两个条件之一,该函数也称为回调函数。

回调可以使用内置函数用户定义函数来实现我们将在本教程中看到这两种实现的示例。

使用内置函数进行回调

Python 中的函数我们都很熟悉sorted让我们先快速回顾一下。

句法:

sorted(iterable, key)
范围 意义
可迭代(强制) 要排序的数据结构(列表、字典等)
key(关键字,可选) 排序标准。可以为其分配您想要使用的任何功能。
排序函数参数

sorted函数被调用时,iterable将首先被传递给key函数,并且函数将在iterable上实现。然后新的/更改的迭代将被排序。

在这里,我们在函数内部调用函数 所以,这里第二个条件就满足了。因此,这里的函数是一个回调函数key sorted key

让我们看一个例子。假设我们必须对字符串列表进行排序。

#list
a = ["lmn", "AbCd", "khJH", "ert", "SuNnY"]
 
#sorted based on the ASCII values
print(sorted(a))
 
#first convert all letters to lowercase & then sort based on ASCII values
print(sorted(a, key=str.lower))

输出:

['AbCd', 'SuNnY', 'ert', 'khJH', 'lmn']
['AbCd', 'ert', 'khJH', 'lmn', 'SuNnY']

如果您还记得的话,“A”的 ASCII 值为 65,“B”为 66,“e”为 101,依此类推。请参阅此链接以获取 ASCII 值表。
因此,在第一种情况下,列表仅根据ASCII 值进行排序。

如果我们观察列表,我们可以看到列表中的字符串是大写和小写字母的混合。比方说,我们现在想要仅根据每个字母的小写形式对列表进行排序。为此,我们在函数中引入了一个新参数key=str.lower

在这里,str.lower首先在可迭代列表上实现。即列表中的字符串转换为小写。现在,列表实际上是'lmn', 'abcd', 'khjh', 'ert', 'sunny',然后该列表被传递给sorted函数。

请注意,全小写列表与原始列表不同,但这里 ‘lmn’ 代表 ‘lmn’,’abcd’ 代表 ‘AbCd’,’khjh’ 代表 ‘khJH’,’ert’ 代表 ‘ert’ 和 ‘sunny’代表原始列表中的“SuNnY”。新列表的排序版本为'abcd', 'ert', 'khjh', 'lmn, 'sunny',因此输出如上所示。

这就是 Python 内置函数中回调的工作原理。

用户定义函数中的回调

现在让我们了解用户定义函数中的回调。让“调用”函数的函数具有名称caller,并且被调用的函数具有名称called这里,caller可以说该函数是主函数called,该函数是从函数,因为主函数总是可以调用从函数,但反之则不然。

假设给定一个由两个整数组成的元组,我们需要计算这两个整数的乘法。

def called(n):
    return n[0]*n[1]
 
def caller(func, n):
    return func(n)
 
#tuple
num = (8, 5)
 
ans = caller(called, num)
 
print("Multiplication =", ans)

输出:

Multiplication = 40

在上面的代码中,我们定义了两个函数:callercalledcalled函数作为参数传递给该caller函数。因此,这里满足了第一个条件,所以这也是回调的一种情况,called就是这里的回调函数。

当程序执行时,首先创建元组,然后caller调用函数。现在,控制转到函数的定义caller它需要两个参数:一个函数 ( func) 和一个可迭代对象 ( n),在本例中它是一个元组。caller函数中,希望将作为参数传递的函数应用于可迭代对象并返回结果 (func(n))。

所以现在,控制位于called函数定义处。它接受一个元组作为参数并返回其成员的乘积。然后将该值返回给caller函数,然后caller函数返回答案,即 8×5 = 40。

概括

因此,我们了解了 Python 中的回调以及如何使用内置函数和用户定义函数来实现它们。