写点什么

python 偏函数

作者:红毛丹
  • 2022 年 6 月 08 日
  • 本文字数:959 字

    阅读完需:约 3 分钟

前言

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

发布于: 刚刚阅读数: 4
用户头像

红毛丹

关注

还未添加个人签名 2022.01.26 加入

全网网名都是红毛丹 掘金个人主页https://juejin.cn/user/1820446987401374

评论

发布
暂无评论
python偏函数_Python_红毛丹_InfoQ写作社区