python的偏函数介绍

偏函数是 Python 中的一个高级特性,可以通过 functools.partial() 函数实现。偏函数可以看作是一个固定了部分参数的可调用对象,它会返回一个新的函数对象,并将原函数的部分参数预设为指定的值。

偏函数通常在以下两种情况下使用:

  1. 需要固定原函数的某些参数,并在后续调用中变动其它参数。这种场景通常用于在类的方法中定义回调函数,或在函数式编程中创建新的函数。

  2. 原函数的输入参数较多,而其中一些参数比较常用,通过偏函数可以减少输入和重复代码。

这里给出一个 functools.partial() 函数的示例:

from functools import partial

def exponentiation(base, exponent):
    return base ** exponent

square = partial(exponentiation, exponent=2)
cube = partial(exponentiation, exponent=3)

print(square(5))
print(cube(5))

# 输出
25
125

在上面的代码中,我们首先定义了一个计算幂次方的函数 exponentiation(),然后使用 functools.partial() 函数来创建两个新的函数 square()cube()。这两个新函数都是 exponentiation() 的偏函数,其中 square() 函数计算传入参数的平方,cube() 函数计算传入参数的立方。

需要注意的是,在使用偏函数时,我们可以通过设定某些参数达到对于函数的简化,同时也可以针对不同的场景实现灵活应用。当然,要保证满足原函数的输入类型规范,才能让偏函数扩展出新的函数或方法。

再举个简单例子,在使用 map() 函数处理列表时,我们通常需要传入两个参数:一个是操作函数,另一个是列表本身。如果操作函数有三个及以上的参数,而我们只需要固定其中一个或两个参数,那么可以考虑使用偏函数。下面是一个使用偏函数的示例:

from functools import partial

def add(x, y, z):
    return x + y + z

add_five = partial(add, 5)
add_five_and_six = partial(add, 5, 6)

list_1 = [1, 2, 3]
list_2 = [4, 5, 6]

result_1 = list(map(add_five, list_1, list_2))
result_2 = list(map(add_five_and_six, list_1))

print(result_1)
print(result_2)

# 输出
[10, 12, 14]
[12, 13, 14]

案例2:

from functools import partial

li1 = [1, 2, 3, 11, 22, 33]

# 通过偏函数创建一个新函数,提前传入原函数所需要的参数,让我们在调用的时候更加简单。
filter1 = partial(filter, lambda x: x > 5)
print(list(filter1(li1)))

# 输出
[11, 22, 33]