本篇我们介绍偏函数(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)。