详细介绍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标准库之随机数 (math包、random包)介绍
Nov 25 Python
python使用7z解压apk包的方法
Apr 18 Python
python中类和实例如何绑定属性与方法示例详解
Aug 18 Python
机器学习python实战之决策树
Nov 01 Python
浅谈DataFrame和SparkSql取值误区
Jun 09 Python
python3.4控制用户输入与输出的方法
Oct 17 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
Feb 25 Python
使用keras内置的模型进行图片预测实例
Jun 17 Python
如何利用python读取micaps文件详解
Oct 18 Python
python切片作为占位符使用实例讲解
Feb 17 Python
python opencv旋转图片的使用方法
Jun 04 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
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
php桥接模式应用案例分析
2019/10/23 PHP
用js实现手把手教你月入万刀(转贴)
2007/11/07 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
js实现简单掷骰子小游戏
2019/10/24 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
js实现前端界面导航栏下拉列表
2020/08/27 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
Python urlopen 使用小示例
2008/09/06 Python
python实现的登录和操作开心网脚本分享
2014/07/09 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
python如何生成网页验证码
2018/07/28 Python
使用TensorFlow搭建一个全连接神经网络教程
2020/02/06 Python
python实现程序重启和系统重启方式
2020/04/16 Python
CSS3中Transform动画属性用法详解
2016/07/04 HTML / CSS
英国口碑最好的的维他命胶囊品牌:Myvitamins(有中文站)
2016/12/03 全球购物
英国袜子店:Sock Shop
2017/01/11 全球购物
分别介绍一下Session Bean和Entity Bean
2015/03/13 面试题
护士实习鉴定范文
2013/12/22 职场文书
母亲七十大寿答谢词
2014/01/18 职场文书
端午节粽子促销活动方案
2014/02/02 职场文书
个人现实表现材料
2014/02/04 职场文书
内科护士节演讲稿
2014/09/11 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书
加强党性修养心得体会
2016/01/21 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python
使用Djongo模块在Django中使用MongoDB数据库
2021/06/20 Python