详细介绍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 Mysql数据库操作 Perl操作Mysql数据库
Jan 12 Python
用Python解析XML的几种常见方法的介绍
Apr 09 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
Nov 04 Python
Python if语句知识点用法总结
Jun 10 Python
Python 支付整合开发包的实现
Jan 23 Python
对python读取zip压缩文件里面的csv数据实例详解
Feb 08 Python
浅析Python与Mongodb数据库之间的操作方法
Jul 01 Python
python深copy和浅copy区别对比解析
Dec 26 Python
python scrapy重复执行实现代码详解
Dec 28 Python
Python检测端口IP字符串是否合法
Jun 05 Python
pytorch学习教程之自定义数据集
Nov 10 Python
Python基础数据类型tuple元组的概念与用法
Aug 02 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
BBS(php & mysql)完整版(三)
2006/10/09 PHP
PHP迅雷、快车、旋风下载专用链转换代码
2010/06/15 PHP
PHP处理postfix邮件内容的方法
2015/06/16 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
类似CSDN图片切换效果脚本
2009/09/17 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
[48:45]Ti4 循环赛第二日 NEWBEE vs EG
2014/07/11 DOTA
python进阶教程之循环相关函数range、enumerate、zip
2014/08/30 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
django实现用户登陆功能详解
2017/12/11 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
简单的Python调度器Schedule详解
2019/08/30 Python
python函数修饰符@的使用方法解析
2019/09/02 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
CheapTickets泰国:廉价航班,查看促销价格并预订机票
2019/12/28 全球购物
初三开学计划书
2014/04/27 职场文书
禁止酒驾标语
2014/06/25 职场文书
专业技术职务聘任证明
2015/03/02 职场文书
警告通知
2015/04/25 职场文书
聘任书范文大全
2015/09/21 职场文书
《槐乡的孩子》教学反思
2016/02/20 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
浅谈redis缓存在项目中的使用
2021/05/20 Redis
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL
Python进程间的通信之语法学习
2022/04/11 Python