详细介绍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 相关文章推荐
python内存管理分析
Apr 08 Python
python实现备份目录的方法
Aug 03 Python
python实现多线程的两种方式
May 22 Python
Python 中 list 的各项操作技巧
Apr 13 Python
Python实现计算圆周率π的值到任意位的方法示例
May 08 Python
pandas DataFrame索引行列的实现
Jun 04 Python
pytorch索引查找 index_select的例子
Aug 18 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
Aug 22 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
Dec 12 Python
如何基于Python创建目录文件夹
Dec 31 Python
利用python制作拼图小游戏的全过程
Dec 04 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 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用mysql数据库存储session的代码
2010/03/05 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
jquery判断单选按钮radio是否选中的方法
2015/05/05 Javascript
分享JavaScript与Java中MD5使用两个例子
2015/12/23 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
jQuery实现frame之间互通的方法
2017/06/26 jQuery
JavaScript操作文件_动力节点Java学院整理
2017/06/30 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
JavaScript HTML DOM元素 节点操作汇总
2019/07/29 Javascript
详解vue-router的导航钩子(导航守卫)
2020/11/02 Javascript
[01:30:54]《加油DOTA》 第三期
2014/08/18 DOTA
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
Python3中多线程编程的队列运作示例
2015/04/16 Python
python基于socket实现网络广播的方法
2015/04/29 Python
python中字典(Dictionary)用法实例详解
2015/05/30 Python
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
在canvas上实现元素图片镜像翻转动画效果的方法
2018/03/20 HTML / CSS
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
员工薪酬福利制度
2014/01/17 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
2016七夕情人节广告语
2016/01/28 职场文书
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL