「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」
前言
Python有个模块,叫fuctiontools,这个functools模块提供了很多有用的功能,,之前讲到的高阶函数reduce就在这个模块里,我们先看一下源码
在这个__all__属性列表里,还包含了一个partial,这个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。
用法
普通函数里有默认参数,来兼容和降低传参的难度,偏函数也可以,举例如下:
例子1
我们创建一个函数,用以处理不同的文件,默认处理txt文件 下面是伪代码啊
def operator_file(file_name, file_type="txt"):
if file_type=="txt":
# do some thing
if file_type=="pdf":
# do some thing
if file_type=="xls":
...
如果要处理大量的csv文件,你想偷个懒,不想每次调用的时候都这样operator(file_name, "csv"),那么我们可能会这样定义一个新函数
def operator_csv(file_name, file_type="csv"):
return operator_file(file_name, file_type=file_type)
然后我们直接去调用operator_csv就好了
如果使用偏函数,就可以省略创建新函数这个步骤,
import functools
operator_csv = functools.partial(operator_file, file_type="csv")
operator_csv(file_name)
我们实际实验一下
总结
所以,简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
注意到上面的新的operator_csv函数,仅仅是把file_type参数重新设定默认值为csv,但也可以在函数调用时传入其他值, 从例子可以看出来,偏函数就是把原来函数的默认值,变为了自己新定义的函数的默认值
csv_file = "111"
txt_file = "222"
operator_csv(csv_file)
operator_csv(txt_file, file_type="txt")
# 运行结果
csv operator success
txt operator success
最后,创建偏函数时,实际上可以接收函数对象、*args和**kw这3个参数,当传入:
operator_csv = functools.partial(operator_file, file_type="csv")
实际上固定了operator_file()函数的关键字参数file_type,也就是:
operator_csv(file_name)
相当于:
kw = { 'file_type': "csv" }
operator_csv(file_name, **kw)
当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。