python 偏函数 partial
1 define
partial() 是被用作“冻结”某些函数的参数或者关键字参数,同时会生成一个带有新标签的对象(即返回一个新的函数)。
2 function
把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数。
直观来看有点类似于装饰器函数,但是其作用主要是对参数进行固定,而不是对整个函数再封装。
3 syntax
依赖引入:from functools import partial
函数格式:partial(func, *args, **kwargs)
*args: 需要被固定的位置参数
**kwargs: 需要被固定的关键字参数
如果在原来的函数 func 中关键字不存在,将会扩展,如果存在,则会覆盖
4 examples
-
给 max 函数添加一个额外的参数
partial_max = partial(max, 100) print(partial_max(1, 2, 99)) # 100
上面是给
max()
函数设定了一个默认参数 100,返回一个新函数,当我们传入参数 (1, 2, 99) 实际上参数中还有一个默认值 100,相当于 (100, 1, 2, 99) ,所以得出的最大值为 100 -
为已有函数提供部分函数的封装,固定 位置/关键字 参数
from functools import partial def func1(*args, **kwargs): print(args) print(kwargs) # 普通调用 func1(1, 2, 3, p1='111', p2='222') """ (1, 2, 3) {'p1': '111', 'p2': '222'} """ # partial 封装下 fun = partial(func1, 100, p1='111', p2='222', p3='333') fun(1, 2, 3, p1='1x1', p2='2x2') """ (100, 1, 2, 3) {'p1': '1x1', 'p2': '2x2', 'p3': '333'} """
该示例参考自:https://zhuanlan.zhihu.com/p/47124891
示例中可以看到,使用 partial 后,100 被固定在了 位置参数中,尽管调用 fun 时没有显示指定,还是会输出 100;关键字参数中,p1, p2 会被同名的新参数的内容替代,p3 因为调用时没指定,所以被固定; -
多个位置参数时,固定前面的若干个
def func2(p1, p2, p3, p4): print(p1, p2, p3, p4) fun = partial(func2, p1, p2, p3) fun('444') """ 1 2x 33 444 """ fun('4x4') """ 1 2x 33 4x4 """
这种情况对应着我们需要对一个函数传入多组参数,但是这些组参数只有个别位置(例如最后一个位置)的取值不同,我们可以通过 fun = partial(func2, p1, p2, p3) 的方式将不变的参数固定住,后面只针对可变参数进行多次调用。巧妙的避免了多次重复传参的写法。
参考:
本文来自博客园,作者:sinatJ,转载请注明原文链接:https://www.cnblogs.com/zishu/p/17388166.html