引入偏函数包:
from functools import partial
前言
partial是Python functools 模块中的一个高阶函数。 它对普通函数进行封装, 主要功能是把一个函数的部分参数给固定住,返回一个新的函数。通俗点说, 就是冻结
原函数的某些参数。:
一句话解释:“把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单(调用新函数的时候不需要输入默认的参数了就)“
基础使用:
例如:
import functools
def add(a, b):
return a + b
add(4, 2)
6
plus3 = functools.partial(add, 3)
plus5 = functools.partial(add, 5)
plus3(4)
7
plus3(7)
10
plus5(10)
15
预先指定某些默认值
什么时候使用?
场景一:
你有一个被其他python代码使用的callable对象,可能是一个回调函数或者是一个处理器, 但是它的参数太多了,导致调用时出错。
def spam(a, b, c, d):
print(a, b, c, d)
>>> from functools import partial
>>> s1 = partial(spam, 1) # a = 1
>>> s1(2, 3, 4)
1 2 3 4
>>> s1(4, 5, 6)
1 4 5 6
>>> s2 = partial(spam, d=42) # d = 42
>>> s2(1, 2, 3)
1 2 3 42
>>> s2(4, 5, 5)
4 5 5 42
>>> s3 = partial(spam, 1, 2, d=42) # a = 1, b = 2, d = 42
>>> s3(3)
1 2 3 42
>>> s3(4)
1 2 4 42
>>> s3(5)
1 2 5 42
场景二:
初次用这个函数, 可能都会有一些疑问, 直接调原函数然后给原函数的参数一些默认参数值就好了, 为什么搞这么复杂?
举个简单的例子, 可能就更好理解了。例如, 你实现了一个乘法函数, 实现2个数相乘:
def mul(x, y):
return x*y
最原始的直接调用函数然后输入值的方法
计算1x2,mul(1,2)
计算4x2,mul(4,2)
你可能已经发现了, 这样写显得比较重复。
给默认值的方法
给y赋个默认值就可以避免重复。
def mul(x, y=2):
return x*y
计算1x2,mul(1)
计算4x2,mul(4)
弊端:但是这样也有个问题, 假设y值变了, 就要修改原函数的默认值,如果有多个需要默认值的情况就只能用“最原始的直接调用函数然后输入值的方法了”。
使用partial函数就可以解决以上问题
mul2 = partial(mul, y=2)
计算1x2,mul2(1)
计算4x2,mul2(4)
假设y初始值变为3, 只需要通过partial生成一个新的函数就好了。
mul3 = partial(mul, y=3)