Python 使用partial()函数

  • Post category:Python

当我们需要重复使用一个函数,并且只改变函数某个参数的取值时,就可以使用 Python 的 functools 模块中的 partial() 函数,它可以帮助我们部分应用(apply)一个函数的参数。本文将详细介绍 partial() 函数的使用方法。

partial() 函数的基本使用

  • 假设有以下一个函数:
def power(x, n):
    return x ** n

我们想固定 x 值,只让用户输入 n,我们可以使用 partial()函数实现:

from functools import partial

square = partial(power, 2)
result = square(3)
print(result)   # 输出 9

在这个例子中,我们定义了一个 square 函数,它实际上就相当于 power 函数在 x=2 的情况下的另一个别名,因此它只有一个参数 n。

  • 再举一个例子,让我们来实现一个总是返回以自然数如 2.71828 为底数的指数函数exponential:
from functools import partial
import math

exponential = partial(math.pow, math.e)
result = exponential(2)
print(result)   # 输出 e 的平方 ≈ 7.22

在这个例子中,我们定义了 exponential 函数,它反映了对 math.pow 的部分应用,当我们想获得以自然数 e 为底数的幂时,这个函数就非常有用。 在这种情况下,我们部分地应用了第一个参数,即底数;并将第二个参数作为常量将其保留在 exponential 函数的定义中。

partial() 函数的高级用法

部分应用不止可以固定一个函数的前一部分参数,还可以传递关键字参数。

  • 如下所示,定义了一个 repeat 函数,我们可以通过这个函数重复打印字符串:
def repeat(word, n=2):
    return word * n

在这个例子中,repeat函数假定默认值为n=2,因此如果没有传递 n 参数,则 n 就是2。假设我们想要打印“hellohello” 10 次,我们可以使用 partial() 函数将输入的字符串定义为变量,而不是重复输入并保留默认的重复次数值。

from functools import partial

double_hello = partial(repeat, 'hello', n=10)
result = double_hello()
print(result)   # 输出 'hellohellohellohellohellohellohellohellohellohello'

在这里,partial()函数的第二个参数 n 被显式地赋一个新值 10,并被加入了 partial() 函数,以此定义了 double_hello 函数,这使它可以只传递一个参数,而不必再理会重复的次数。

总体而言,Python 中的 partial() 函数非常灵活,可以令代码更加简洁。