python偏函数

661 阅读2分钟

「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战

前言

Python有个模块,叫fuctiontools,这个functools模块提供了很多有用的功能,,之前讲到的高阶函数reduce就在这个模块里,我们先看一下源码

image.png

在这个__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)

我们实际实验一下

image.png

总结

所以,简单总结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可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。