Python 使用partial()函数

  • Post category:Python

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,然后再调用这个函数。这样就可以达到我们的目的了。