回调是Python以及Javascript、C等其他语言中的一个通用概念。我们知道Python是一种面向对象的语言,函数是Python中的一等对象。这意味着,在Python中,我们可以将函数返回的值分配给变量,并从另一个函数返回一个函数。
在本教程中,我们将了解 Python 编程语言中回调的概念,并且还将看到一些与之相关的示例。那么让我们开始吧。
Python 中的回调函数
当一个函数被另一个函数调用时,它被称为回调。回调函数是作为参数传递给另一个函数的函数。可以通过两种方式完成:
- 将一个函数作为参数传递给另一个函数
- 在另一个函数内部调用一个函数
以上两点可以帮助您确定给定函数是否是回调函数。一个函数不一定要同时满足上述两个条件才能成为回调函数。即使满足上述两个条件之一,该函数也称为回调函数。
回调可以使用内置函数和用户定义函数来实现。我们将在本教程中看到这两种实现的示例。
使用内置函数进行回调
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 |
在上面的代码中,我们定义了两个函数:caller
和called
。该called
函数作为参数传递给该caller
函数。因此,这里满足了第一个条件,所以这也是回调的一种情况,called
就是这里的回调函数。
当程序执行时,首先创建元组,然后caller
调用函数。现在,控制转到函数的定义caller
。它需要两个参数:一个函数 ( func
) 和一个可迭代对象 ( n
),在本例中它是一个元组。在caller
函数中,希望将作为参数传递的函数应用于可迭代对象并返回结果 (func(n))。
所以现在,控制位于called
函数定义处。它接受一个元组作为参数并返回其成员的乘积。然后将该值返回给caller
函数,然后caller
函数返回答案,即 8×5 = 40。
概括
因此,我们了解了 Python 中的回调以及如何使用内置函数和用户定义函数来实现它们。