偏函数

作者: 闲云野鹤_23dd | 来源:发表于2021-01-24 16:34 被阅读0次

    偏函数

    什么是偏函数?

    简单的理解偏函数,它是对原始函数的二次封装,是将现有函数的部分参数预先绑定为指定值,从而得到一个新的函数,该函数就称为偏函数。相比原函数,偏函数具有较少的可变参数,从而降低了函数调用的难度。

    定义偏函数,需使用 partial 关键字(位于 functools 模块中),其语法格式如下:

    偏函数名 = partial(func, *args, **kwargs)

    其中,func 指的是要封装的原函数,*args 和 **kwargs 分别用于接收无关键字实参和关键字实参。

    # 原始方案
    def filter1(l): # 定义一个过滤出列表中偶数的方法
        return list(filter(lambda x: x%2==0,l))
    
    # 调用函数对列表进行过滤
    print(filter1([1,2,3,4,5,6,7])) 
    print(filter1([11,12,13,14,15,16,17]))
    print(filter1([21,22,23,24,25,26,27]))
    
    # 使用偏函数解决
    from functools import partial # 导入partial模块
    
    #通过偏函数创建一个新函数,提前传入原函数所需要的参数,让我们在调用的时候更加简单。
    filter2 = partial(filter,lambda x:x%2==0)
    
    # 使用偏函数过滤列表数据
    print(list(filter2([1,2,3,4,5,6,7])))
    print(list(filter2([11,12,13,14,15,16,17])))
    print(list(filter2([21,22,23,24,25,26,27])))` 
    

    运行结果为:

    [2, 4, 6]
    [12, 14, 16]
    [22, 24, 26]

    结合以上示例不难分析出,偏函数的本质是将函数式编程、默认参数和冗余参数结合在一起,通过偏函数传入的参数调用关系,与正常函数的参数调用关系是一致的。

    偏函数通过将任意数量(顺序)的参数,转化为另一个带有剩余参数的函数对象,从而实现了截取函数功能(偏向)的效果。在实际应用中,可以使用一个原函数,然后将其封装多个偏函数,在调用函数时全部调用偏函数,一定程度上可以提高程序的可读性。

    偏函数传递关键字参数

    # 准备一个原函数
    def info(age,name):
        print("姓名:{},年龄{}".format(name,age))
    
    from functools import partial
    pinfo = partial(info,age=18) # 定义偏函数时设置默认值
    
    pinfo(name = "xuepl") # 使用偏函数的时候,注意要使用关键字的方式传参,要符合关键字传参的顺序
    
    

    注意: 上方的例子中,因为在定义偏函数时,设置的默认值为第一个参数,调用偏函数的时候,需要以关键字传参的方案去传递第二个参数

    # 准备一个原函数
    def info(name,age):
        print("姓名:{},年龄{}".format(name,age))
    
    from functools import partial
    pinfo = partial(info,age=18) # 定义偏函数时设置默认值
    
    pinfo("xuepl") # 位置传参
    pinfo(name = "xuepl") # 关键字传参都可以` 
    

    上例中,使用偏函数定义默认值的时候,定义的是第二个参数,所以在使用偏函数给第一个参数传参时,既可以使用位置参数和关键字参数

    普通函数封装和偏函数封装应用场景

    • 首先都是对他人提供的函数做的二次封装
    • 普通封装适用于在调用方法前后要做些预处理操作
    • 偏函数适用于在调用方法前设置一些默认参数,不能添加预处理操作

    练习:

    现有原函数:
    def f1(a,b,c):
    return a+b-c
    要求为f1 写一个偏函数,固定传入参数c 为10

    def f1(a,b,c):
        return a+b-c
    #要求为f1 写一个偏函数,固定传入参数c 为10
    pf1=partial(f1,c=10)
    print(pf1(1,2))
    print(pf1(b=1,a=2))

    相关文章

      网友评论

          本文标题:偏函数

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