详细介绍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学习笔记之常用函数及说明
May 23 Python
Python标准库之随机数 (math包、random包)介绍
Nov 25 Python
python使用post提交数据到远程url的方法
Apr 29 Python
python使用分治法实现求解最大值的方法
May 12 Python
Django 导出 Excel 代码的实例详解
Aug 11 Python
Python中使用Counter进行字典创建以及key数量统计的方法
Jul 06 Python
python将excel转换为csv的代码方法总结
Jul 03 Python
Python调用scp向服务器上传文件示例
Dec 22 Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 Python
python实现猜单词游戏
May 22 Python
Python pathlib模块使用方法及实例解析
Oct 05 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 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 正则学习实例
2008/07/30 PHP
基于php设计模式中单例模式的应用分析
2013/05/15 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
PHP中使用break跳出多重循环代码实例
2015/01/21 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
php生成word并下载代码实例
2019/03/15 PHP
JavaScript中this关键字使用方法详解
2007/03/08 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
仿百度换肤功能的简单实例代码
2016/07/11 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
前端构建工具之gulp的语法教程
2017/06/12 Javascript
JS实现json的序列化和反序列化功能示例
2017/06/13 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
webpack4实现不同的导出类型
2019/04/09 Javascript
python实现的jpg格式图片修复代码
2015/04/21 Python
python删除过期文件的方法
2015/05/29 Python
Python爬取网页中的图片(搜狗图片)详解
2017/03/23 Python
Python实现完整的事务操作示例
2017/06/20 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
意大利火车票和铁路通行证专家:ItaliaRail
2019/01/22 全球购物
Java和Javasciprt的区别
2012/09/02 面试题
《圆明园的毁灭》教学反思
2014/02/28 职场文书
机关单位人员学雷锋心得体会
2014/03/10 职场文书
班级体育活动总结
2014/07/05 职场文书
支教个人总结
2015/03/04 职场文书
土建技术员岗位职责
2015/04/11 职场文书
python中sys模块的介绍与实例
2021/04/17 Python
python unittest单元测试的步骤分析
2021/08/02 Python
JavaScript异步操作中串行和并行
2021/11/20 Javascript