摘要:在本教程中,你将学习 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 中创建偏函数。