整体说明
在 Python 里,
functools模块中的partial函数能够用来创建新函数,这些新函数是对现有函数部分参数预先赋值后的版本借助这种方式,能简化函数调用,让代码更为简洁,常用在一些较为专业的底层框架中
函数形式:
1
2
3from functools import partial
new_func = partial(func, *args, **kwargs)func代表原函数args和kwargs分别是要预先设置的位置参数和关键字参数- 调用
new_func时,只需传入剩余未预先设置的参数就行
固定函数参数
假设存在一个加法函数
add(a, b),现在要创建一个专门用于加 10 的新函数:1
2
3
4
5
6
7
8
9
10from functools import partial
def add(a, b):
return a + b
add_ten = partial(add, 10) # 把 a 固定为 10
print(add_ten(5)) # 输出 15(也就是 10 + 5)
print(add_ten(10)) # 输出 20(也就是 10 + 10)
print(add_ten(5, 20)) # 输出 25(此时 10 被 5 覆盖,函数计算的是 5 + 20)- 注意:固定的是第一个参数
处理关键字参数
在处理关键字参数 Demo:
1
2
3
4
5
6
7
8def power(base, exponent):
return base ** exponent
square = partial(power, exponent=2) # 固定 exponent 为 2
cube = partial(power, exponent=3) # 固定 exponent 为 3
print(square(5)) # 输出 25(即 5^2)
print(cube(5)) # 输出 125(即 5^3)- 注意:可通过关键字参数指明具体参数
需要注意的点
参数顺序问题 :使用
partial固定参数时,参数是按照位置依次绑定的- 比如
partial(func, 10)会把 10 绑定到func的第一个参数上
- 比如
参数覆盖 :如果预先设置的参数在新函数调用时又被传入了新值,那么新传入的值会覆盖预先设置的值
- 例如:
1
2
3add_ten = partial(add, 10)
print(add_ten(5)) # 输出 15
print(add_ten(5, 20)) # 输出 25(此时 10 被 5 覆盖,函数计算的是 5 + 20)
- 例如:
函数属性保留 :通过
partial创建的新函数会保留原函数的一些属性- 像
__name__和__doc__等函数属性还在
- 像
附录:与 Lambda 表达式的对比
使用 partial 和 lambda 都能实现参数固定的效果,但它们之间也有区别:
1 | # 使用 partial |
partial函数在代码简洁性上表现更优,并且能够保留原函数的元信息lambda表达式则更为灵活,可以实现更复杂的逻辑