详细介绍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删除windows垃圾文件的方法
Jul 14 Python
CentOS安装pillow报错的解决方法
Jan 27 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
Jul 02 Python
利用Python为iOS10生成图标和截屏
Sep 24 Python
Python urls.py的三种配置写法实例详解
Apr 28 Python
python实现人脸识别代码
Nov 08 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
Jun 11 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
Sep 02 Python
Python爬虫实战之12306抢票开源
Jan 24 Python
对python中 math模块下 atan 和 atan2的区别详解
Jan 17 Python
tensorflow模型继续训练 fineturn实例
Jan 21 Python
Python max函数中key的用法及原理解析
Jun 26 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
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
PHP合并静态文件详解
2014/11/14 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
2010/08/24 Javascript
javascript当中的代码嗅探扩展原生对象和原型(prototype)
2013/01/11 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
2014/05/07 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
2015/04/17 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
python利用beautifulSoup实现爬虫
2014/09/29 Python
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
numpy返回array中元素的index方法
2018/06/27 Python
Python 获取中文字拼音首个字母的方法
2018/11/28 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
2019/05/13 Python
Python Sympy计算梯度、散度和旋度的实例
2019/12/06 Python
HTML5中meta属性的使用方法
2016/02/29 HTML / CSS
项目管理计划书
2014/01/09 职场文书
生产部管理制度
2014/01/31 职场文书
学生个人自我鉴定
2014/03/26 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
化工实习心得体会
2014/09/09 职场文书
2014年教师节红领巾广播稿
2014/09/10 职场文书
个人作风建设总结
2014/10/23 职场文书
民事和解协议书格式
2014/11/29 职场文书
2014年绿化工作总结
2014/12/09 职场文书