偏函数

作者: 伟大的洪立 | 来源:发表于2018-08-01 11:03 被阅读0次

    偏函数作用

    Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)
    偏函数的作用:将所作用的函数作为partial()函数的第一个参数,原函数的各个参数依次作为partial()函数的后续参数,原函数有关键字参数的一定要带上关键字,没有的话,按原有参数顺序进行补充。
    简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

    偏函数的使用

    偏函数的第二个部分(可变参数), 按原来函数的参数顺序进行补充, 参数将作用于原函数上, 最后偏函数返回一个新函数(类似装饰器, 对于函数进行二次包装, 产生特殊效果; 但又不同于装饰器, 偏函数产生了一个新函数, 而装饰器, 可改变被装饰器的函数入口地址也可以不影响原函数)

    装饰器实现

    from functools import wraps
    
    def sum_add(*args1):  # 给装饰器带上参数
        def decorator(func):
            @wraps(func)  # 加上这句,原函数func被decorator作用后,函数性质不变
            def my_sum(*args2):
                my_s = 0 
                for n in args1:
                    print(n)
                    my_s = my_s + n # 这个是我们新加的求和结果
                return func(*args2) + my_s # 在原求和函数的结果上在加S,并返回这个值
            return my_sum # 返回my_sum函数, 该函数扩展原函数的功能
        return decorator # 返回装饰器
    
    @ sum_add(10, 20) # 使用装饰器
    def sum(*args):
        s = 0
        for n in args:
            print("---------")
            print(n)
            print("---------")
            s = s+n
        return s
    
    print(sum(1, 2, 3, 4, 5))
    print(sum.__name__)
    

    装饰器只是在原函数上进行了扩展功能, 并不能影响我们的原函数

    • 偏函数实现
    # 普通函数可变参数执行
    def sum(*args):
        s = 0
        for n in args:
            s = s + n 
        return s
    print(sum(10, 20)+sum(1, 2, 3, 4, 5))
    
    # 普通函数可变参数加关键字参数组合
    def sum(*args, **others):
        s = 0 
        for n in args:
            s = s + n
        s1 = 0
        for k in others:
            s1 = s1 + others[k] # 关键字参数里蕴藏的求和结果, k是dict中的key值
        return s + s1
    D = {'value': 10, 'value1': 20}
    print(sum(1, 2, 3, 4, 5, **D))
    
    # 偏函数可变参数顺序填充
    from functools import partial
    
    def sum(*args):
        s = 0
        for n in args:
            s = s + n
        return s
    
    sum_add_10 = partial(sum, 10) # 10作用在sum第一个参数的位置
    sum_add_10_20 = partial(sum, 10, 20)  # 10,20 分别作用在sum第一个和第二个参数位置
    print('A__________sum函数的地址入口:')
    print(sum)
    print("B__________partial函数返回函数的入口:")
    print(partial(sum,10))
    print(sum_add_10(1, 2, 3, 4, 5)) # 10+1+2+3+4+5
    print(sum_add_10_20(1, 2, 3, 4, 5)) # 10+20+1+2+3+4+5
    

    通过几个例子,我们最终发现,还是偏函数比较方便,一行代码就搞定了,而且新定义的函数,可以根据函数名很容易知道,这个函数扩展的原函数是哪个,实现的效果是:

    from functools import partial
    
    L = list(range(1, 11))
    slice_5_10 = partial(slice, 5, 10)
    print(L[slice_5_10])  # [6, 7, 8, 9, 10]
    

    偏函数的第三个部分(关键字参数), 按原有函数的关键字参数进行填补,参数将作用在与原函数上, 参数将作用于原函数上, 最后偏函数返回一个新函数

    import functools
    def mod(m, *, key=2):
        return m % key == 0
    mod_to_2 = functools.partial(mod, key=2)
    print(mod(3)) # False
    print(mod_to_2(3)) # False
    mod_to_5 = functools.partial(mod, key=5)
    print(mod(25, key=5)) # True
    print(mod_to_5(25))  # True
    

    参考博客:
    https://blog.csdn.net/appleyk/article/details/77609114

    相关文章

      网友评论

          本文标题:偏函数

          本文链接:https://www.haomeiwen.com/subject/kwnfvftx.html