详细介绍Python中的偏函数


Posted in Python onApril 27, 2015

Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。

在介绍函数参数的时候,我们讲到,通过设定参数的默认值,可以降低函数调用的难度。而偏函数也可以做到这一点。举例如下:

int()函数可以把字符串转换为整数,当仅传入字符串时,int()函数默认按十进制转换:

>>> int('12345')
12345

但int()函数还提供额外的base参数,默认值为10。如果传入base参数,就可以做N进制的转换:

>>> int('12345', base=8)
5349
>>> int('12345', 16)
74565

假设要转换大量的二进制字符串,每次都传入int(x, base=2)非常麻烦,于是,我们想到,可以定义一个int2()的函数,默认把base=2传进去:

def int2(x, base=2):
  return int(x, base)

这样,我们转换二进制就非常方便了:

>>> int2('1000000')
64
>>> int2('1010101')
85

functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2:

>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85

所以,简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

注意到上面的新的int2函数,仅仅是把base参数重新设定默认值为2,但也可以在函数调用时传入其他值:

>>> int2('1000000', base=10)
1000000

最后,创建偏函数时,实际上可以接收函数对象、*args和**kw这3个参数,当传入:

int2 = functools.partial(int, base=2)

实际上固定了int()函数的关键字参数base,也就是:

int2('10010')

相当于:

kw = { base: 2 }
int('10010', **kw)

当传入:

max2 = functools.partial(max, 10)

实际上会把10作为*args的一部分自动加到左边,也就是:

max2(5, 6, 7)

相当于:

args = (10, 5, 6, 7)
max(*args)

结果为10。
小结

当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

Python 相关文章推荐
Python3实现从文件中读取指定行的方法
May 22 Python
python生成IP段的方法
Jul 07 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
Jun 21 Python
Python实现pdf文档转txt的方法示例
Jan 19 Python
pytorch梯度剪裁方式
Feb 04 Python
python实现音乐播放器 python实现花框音乐盒子
Feb 25 Python
Python 读取xml数据,cv2裁剪图片实例
Mar 10 Python
Anconda环境下Vscode安装Python的方法详解
Mar 29 Python
从python读取sql的实例方法
Jul 21 Python
详解python安装matplotlib库三种失败情况
Jul 28 Python
详解Python模块化编程与装饰器
Jan 16 Python
举例讲解Python中装饰器的用法
Apr 27 #Python
Python中的匿名函数使用简介
Apr 27 #Python
Python中用函数作为返回值和实现闭包的教程
Apr 27 #Python
Python中利用sorted()函数排序的简单教程
Apr 27 #Python
Python中的filter()函数的用法
Apr 27 #Python
Python中的map()函数和reduce()函数的用法
Apr 27 #Python
PyMongo安装使用笔记
Apr 27 #Python
You might like
php反射应用示例
2014/02/25 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
JavaScript 语言的递归编程
2010/05/18 Javascript
jquery实现滑动图片自己测试的例子
2013/11/05 Javascript
关于延迟加载JavaScript
2015/05/05 Javascript
JS+CSS实现六级网站导航主菜单效果
2015/09/28 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
JS模仿手机端九宫格登录功能实现代码
2016/04/28 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
AngularJS路由切换实现方法分析
2017/03/17 Javascript
ES6新特性八:async函数用法实例详解
2017/04/21 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
python模拟enum枚举类型的方法小结
2015/04/30 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
通过Python实现自动填写调查问卷
2017/09/06 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
opencv python 图像去噪的实现方法
2018/08/31 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
python kafka 多线程消费者&手动提交实例
2019/12/21 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
整理的15个非常有用的 HTML5 开发教程和速查手册
2011/10/18 HTML / CSS
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
天鹅的故事教学反思
2014/02/04 职场文书
记账会计岗位职责
2014/06/16 职场文书
国际语言毕业生求职信
2014/07/08 职场文书
村委会贫困证明范本
2014/09/17 职场文书
四风自我剖析材料思想汇报
2014/10/01 职场文书
党支部半年考察意见
2015/06/01 职场文书