Python入门教程第61篇 函数进阶之偏函数

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python入门教程第61篇 函数进阶之偏函数相关的知识,希望对你有一定的参考价值。

本篇我们介绍偏函数(partial function)的概念,以及如何利用 functools 模块中的 partial 函数定义偏函数。

偏函数的概念

以下示例定义了一个乘法函数,可以将两个参数相乘:

def multiply(a, b):
    return a*b

有时候,我们仅仅想要将一个参数和指定的数字(例如 2)相乘。为此,我们可以重用上面的 multiply 函数,例如:

def double(a):
    return multiply(a,2)

函数 double 返回了函数 multiply,它将数字 2 传递给了函数 multiply 的第二个参数。

以下示例调用了 double 函数:

result = double(10)
print(result)    

将以上代码合并到一起:

def multiply(a, b):
    return a*b


def double(a):
    return multiply(a, 2)


result = double(10)
print(result)  # 20

可以看出, double 函数固定了 multiply 函数的第二个参数值,从而创建了一个更加简单的新函数。也就是说,double 函数简化了 multiply 函数的复杂性和功能。在 Python 中,这种 double 函数被称为偏函数(partial function)。

在实际使用中,当我们想要简化某个函数的参数个数,从而简化函数功能时可以使用偏函数。

由于用户不时需要创建偏函数,Python 在标准模块 functools 中提供了 partial 函数,可以帮助我们更方便地定义偏函数。

functools 模块中的 partial 函数

以下是functools 模块中 partial 函数的语法:

functools.partial(fn, /, *args, **kwargs)

函数 partial 返回的结果是一个新的可被调用的偏函数对象。当我们调用该对象时,Python 会使用位置参数 args 和关键字参数 kwargs 调用 fn 函数。以下示例使用 partial 函数定义上面的 double 函数:

from functools import partial

def multiply(a, b):
    return a*b


double = partial(multiply, b=2)

result = double(10)
print(result)

输出结果如下:

20

以上示例的执行过程如下:

  • 首先,从 functools 模块中导入 partial 函数。
  • 然后,定义 multiply 函数。
  • 最后,调用 partial 函数返回一个偏函数对象并赋予变量 double。

当我们调用 double 对象时,Python 实际调用的是 multiply 函数,同时参数 b 的值默认为 2。

如果我们将更多的参数传递给偏函数对象,Python 会将它们赋值给 args 参数。如果我们将额外的关键字参数传递给偏函数对象,Python 会将它们赋值给 kwargs 参数。因此,我们也可以这样调用 double 函数:

double(10, b=3)

以上示例中, Python 会调用 multiply 函数并将数字 3(而不是 2)传递给参数。因此输出的结果如下:

30

偏函数与变量

有时候我们可能想要使用变量定义偏函数,例如:

from functools import partial


def multiply(a, b):
    return a*b


x = 2
f = partial(multiply, x)

result = f(10)  # 20
print(result)

x = 3
result = f(10)  # 20
print(result)

以上示例中,我们将变量 x 从 2 修改为 3,希望 f(10) 返回 30 ,而不是 20。

但是,f(10) 还是返回了 20。这是因为 Python 在以下语句中计算了 x 的值:

f = partial(multiply, x)

所以,当我们在后面的代码中将 x 的值修改为 3 时,偏函数的定义不会改变。

总结

  • Python 利用 functools 模块中的 partial 函数定义偏函数(partial function)。

以上是关于Python入门教程第61篇 函数进阶之偏函数的主要内容,如果未能解决你的问题,请参考以下文章

python进阶第1篇 函数入门

Python入门教程第62篇 函数进阶之类型提示

廖雪峰的Python系列教程——函数式编程之偏函数

Python之偏函数

Python入门教程第60篇 函数进阶之可变关键字参数

Python入门教程第58篇 函数进阶之元组解包