MEMOO
MEMOO
Published on 2025-04-20 / 2 Visits
0
0

Python偏函数

摘要:在本教程中,你将学习 Python 偏函数以及如何使用 functools 模块中的 partial 函数来定义偏函数。

Python 偏函数介绍

以下示例定义了一个用于乘以两个参数的函数:

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 函数的第二个参数,从而生成了一个具有更简单签名的新函数。

换句话说double 函数简化了 multiply 函数的复杂性。

在 Python 中double 函数被称为偏函数。

在实践中,当你想要减少函数的参数数量以简化函数的签名时,就会使用偏函数。

由于你有时会创建偏函数,因此 Python 在 functools 标准模块中为你提供了 partial 函数,以帮助你更轻松地定义偏函数。

functools 模块中的 Python 偏函数

以下展示了 functools 模块中 partial 函数的语法:

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

partial 函数返回一个新的偏函数对象,该对象是可调用的。

当你调用这个偏函数对象时,Python 会使用位置参数 args 和关键字参数 kwargs 来调用 fn 函数。

以下示例展示了如何使用 partial 函数从 multiply 函数定义 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 函数,其中 b 参数的值为 3,而不是 2。

并且你会看到以下输出:

30

Python 偏函数与变量

有时候,你可能希望使用变量来创建偏函数。例如:

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)

输出:

20
20

在这个示例中,我们将 x 改为 3,并期望 f(10) 返回 30 而不是 20。

然而f(10) 返回的却是 20。这是因为 Python 在执行以下语句时对 x 的值进行了求值:

f = partial(multiply, x)

……但在那之后(即创建偏函数时)x 的值就不会再被重新评估了,因此,当 x 引用新的数字(3)时,偏函数并不会改变。

总结

  • 使用 functools 模块中的 partial 函数来在 Python 中创建偏函数。


Comment