Python使用partial()函数详解
在Python标准库的functools
模块中,提供了一个很有用的函数partial
。这个函数是一个高级函数(higher-order function),它可以让函数的某些参数的默认值在函数定义时就确定下来,这样在调用函数时就不需要传递这些参数了。
partial的语法如下:
functools.partial(function, *args, **keywords)
其中function
是一个函数对象,*args
和**keywords
是可选的参数。
partial
函数的返回值是一个新的函数对象,这个函数对象和原始函数对象功能类似,但原始函数对象的某些参数的默认值已经被固定下来了。
使用partial()函数
假设我们有一个需要求某个数的平方值的函数:
def square(x):
return x ** 2
使用square
函数来计算1到5之间的整数的平方值可以这样实现:
for i in range(1, 6):
print(square(i))
如果使用partial
函数来固定x
的值为2,就可以实现一个新的函数square_2
:
from functools import partial
square_2 = partial(square, x=2)
此时我们就可以把第一个参数x
的值固定为2,从而得到一个计算2的平方值的新函数square_2
。
print(square_2()) # 输出:4
我们也可以使用partial
函数来固定square
函数的参数,实现一个新的函数:
square_2 = partial(square, 2)
这个新函数和上面的函数是等价的。
print(square_2()) # 输出:4
示例说明
示例一
假设我们有一组数据:
data = [1, 3, 5, 7, 9]
我们想要对它们求平均值。
from functools import partial
def average(*args):
return sum(args) / len(args)
data = [1, 3, 5, 7, 9]
print(average(*data))
结果输出为:
5.0
现在我们想要一个函数,它能够固定参数,只有在传入固定数量的参数时才可以调用。我们可以使用partial
函数来实现这个需求。
我们来创建一个函数average_5
,它只接受5个参数,并求这5个参数的平均值。
average_5 = partial(average, 1, 3, 5, 7, 9)
print(average_5()) # 输出:5.0
示例二
假设我们有一个函数add
,它有3个参数。
现在我们有一个需求:每次调用add
函数时,第三个参数的值都会递增1。
def add(a, b, c):
return a + b + c
c = 0
def add_inc(a, b):
global c
c += 1
return add(a, b, c)
print(add_inc(1, 2))
print(add_inc(1, 2))
print(add_inc(1, 2))
输出结果如下:
4
7
10
这个需求可以利用partial
函数来实现:
from functools import partial
def add(a, b, c):
return a + b + c
add_inc = partial(add, c=0)
def add_inc2(a, b):
global add_inc
add_inc.args = (a, b, add_inc.keywords['c']+1)
return add_inc()
print(add_inc2(1, 2))
print(add_inc2(1, 2))
print(add_inc2(1, 2))
输出结果如下:
4
7
10
我们用partial
函数先构造了一个固定了c
的新函数add_inc
,然后在每次调用add_inc2
函数时,将add_inc
函数(即add
函数的固定版本)的第三个参数c
递增1,然后再调用这个函数。这样就可以达到我们的目的了。