6. 函数进阶
6.2 函数类型

基本概念

在第五章中,我们学习了几种 Python 的数据类型,例如字符串、列表、字典等等;但也有几个类型并没有讲解,函数类型就是其中之一。我们将在本节对其进行详细地介绍。

前面介绍过,在 Python 中,函数相当于方法,本质上是一段可以复用的代码。我们可以通过调用的方式,让函数执行其内部的代码。对于开发人员而言,这部分很容易理解。但是,这只是函数的而一个方面;从另一方面看,函数也是 Python 里的一种数据类型,我们可以把一个函数看作是类型为函数的一个对象。

换句话来说,当我们使用 def 语句在 Python 中定义一个新函数时,我们实际上创建了一个数据类型为 function 的新对象,对象名就是函数名。

举个例子:

def add(x, y):
    return x + y

在此例中,我们使用 def 语句定义了一个名为 add 的函数;如果换一个角度,我们也可以说:我们使用 def 语句定义了一个名为 add 的对象,其类型为 function

Python 将一个函数视为对象,可以为程序开发带来很多好处,例如:

  • 可以将函数作为参数传递给另一个函数。
  • 可以作为返回值,从一个函数返回另一个函数。
  • 可以将函数存储在数据结构中。

下面,让我们看几个具体的示例。

基本用法

以下的这些例子,将为我们说明如何以对象的方式使用函数:

1. 函数作为参数传递给另一个函数

def apply_operation(operation, x, y):
    return operation(x, y)
 
def add(x, y):
    return x + y
 
def subtract(x, y):
    return x - y
 
result1 = apply_operation(add, 3, 4)    # 返回 7
result2 = apply_operation(subtract, 3, 4)   # 返回 -1

在此例中,我们定义了一个名为 apply_operation 的函数,它有三个参数:operation,它是一个函数,以及 xy,它们都是数字。apply_operation 函数调用 operation 函数,并将 xy 作为参数传递给 operation 函数,最后返回结果。

我们接着定义了两个名为 addsubtract 的函数,它们接受两个数字作为参数并返回加法或减法结果。然后,我们将这些函数作为 operation 参数传递给了 apply_operation 函数以执行加法或减法。

2. 从一个函数返回另一个函数

def make_multiplier(n):
    def multiplier(x):
        return n * x
    return multiplier
 
double = make_multiplier(2)
triple = make_multiplier(3)
 
result1 = double(4)    # 返回 8
result2 = triple(4)    # 返回 12

在此例中,我们定义了一个名为 make_multiplier 的函数,它有一个参数 nmake_multiplier函数定义了一个名为 multiplier 的嵌套函数,它接受一个参数 x 并返回 nx 的乘积。make_multiplier函数然后返回 multiplier 函数。

我们可以为 make_multiplier 函数传递不同的 n 值,这样就可以创建若干个将数字乘以特定因子的新函数。在此例中,我们创建了两个名为 doubletriple 的函数,它们将数字分别乘以 23。最后,我们使用不同的参数调用这些函数以执行乘法。

3. 可以将函数存储在数据结构中

def add(x, y):
    return x + y
 
def subtract(x, y):
    return x - y
 
operations = {'add': add, 'subtract': subtract}
 
result1 = operations['add'](3, 4)    # 返回 7
result2 = operations['subtract'](3, 4)   # 返回 -1

在此示例中,我们定义了两个名为 addsubtract 的函数,它们分别执行加法和减法操作。然后,我们创建了一个名为 operations 的字典,将字符串键映射到函数值。我们可以使用字符串键访问 operations 字典中的函数,然后使用适当的参数调用函数。

通过这几个示例,我们可以看到,Python 将函数视为对象,确实可以使 Python 语言更加灵活和强大,进而允许开发人员使用更复杂的编程技术。

总结

综上所述,在 Python 中,函数可以被看作是一种数据类型为 function 的对象,并且可以像 Python 语言中的其他对象一样被我们操作和使用。这在很大程度上增加了 Python 语言的灵活性。