Loading

python 偏函数 partial


1 define

partial() 是被用作“冻结”某些函数的参数或者关键字参数,同时会生成一个带有新标签的对象(即返回一个新的函数)。

2 function

把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数。
直观来看有点类似于装饰器函数,但是其作用主要是对参数进行固定,而不是对整个函数再封装。

3 syntax

依赖引入:from functools import partial

函数格式:partial(func, *args, **kwargs)
*args: 需要被固定的位置参数
**kwargs: 需要被固定的关键字参数

如果在原来的函数 func 中关键字不存在,将会扩展,如果存在,则会覆盖

4 examples

  1. 给 max 函数添加一个额外的参数

    partial_max = partial(max, 100)
    print(partial_max(1, 2, 99))  # 100	
    

    上面是给 max() 函数设定了一个默认参数 100,返回一个新函数,当我们传入参数 (1, 2, 99) 实际上参数中还有一个默认值 100,相当于 (100, 1, 2, 99) ,所以得出的最大值为 100

  2. 为已有函数提供部分函数的封装,固定 位置/关键字 参数

    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 因为调用时没指定,所以被固定;

  3. 多个位置参数时,固定前面的若干个

    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) 的方式将不变的参数固定住,后面只针对可变参数进行多次调用。巧妙的避免了多次重复传参的写法。


参考:

posted @ 2023-05-10 15:32  sinatJ  阅读(260)  评论(0编辑  收藏  举报