详细介绍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 的枚举 Enum
Jun 12 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
Dec 14 Python
详解Python if-elif-else知识点
Jun 11 Python
Python计算时间间隔(精确到微妙)的代码实例
Feb 26 Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
Aug 12 Python
python读取raw binary图片并提取统计信息的实例
Jan 09 Python
Python字符编码转码之GBK,UTF8互转
Feb 09 Python
python 安装移动复制第三方库操作
Jul 13 Python
python 实现socket服务端并发的四种方式
Dec 14 Python
使用python向MongoDB插入时间字段的操作
May 18 Python
Python各协议下socket黏包问题原理
Apr 12 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 获取全局变量的代码
2011/04/21 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
php判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
js 控制页面跳转的5种方法
2013/09/09 Javascript
一个js控制的导航菜单实例代码
2013/12/03 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
jQuery中remove()方法用法实例
2014/12/25 Javascript
详谈LABJS按需动态加载js文件
2015/05/07 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
js 提取某()特殊字符串长度的实例
2017/12/06 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
JS实现transform实现扇子效果
2020/01/17 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
Python 3 判断2个字典相同
2019/08/06 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
Python通用唯一标识符uuid模块使用案例
2020/09/10 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
印度首选时尚目的地:Reliance Trends
2018/01/17 全球购物
BASIC HOUSE官方旗舰店:韩国著名的服装品牌
2018/09/27 全球购物
香港通票:Hong Kong Pass
2019/02/26 全球购物
乌克兰巴士票购买网站:inBus
2021/03/12 全球购物
秋季运动会加油稿200字
2014/01/11 职场文书
医院节能减排方案
2014/06/13 职场文书
委托书格式
2014/08/01 职场文书
邀请函样本
2015/02/02 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
致男子1500米运动员的广播稿
2019/11/08 职场文书