偏函数
什么是偏函数?
简单的理解偏函数,它是对原始函数的二次封装,是将现有函数的部分参数预先绑定为指定值,从而得到一个新的函数,该函数就称为偏函数。相比原函数,偏函数具有较少的可变参数,从而降低了函数调用的难度。
定义偏函数,需使用 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))
网友评论