详细介绍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根据出生日期返回年龄的方法
Mar 26 Python
python获取一组数据里最大值max函数用法实例
May 26 Python
分享Python开发中要注意的十个小贴士
Aug 30 Python
Python使用迭代器捕获Generator返回值的方法
Apr 05 Python
解决python爬虫中有中文的url问题
May 11 Python
浅析Python函数式编程
Oct 06 Python
Python面向对象之类和对象实例详解
Dec 10 Python
利用arcgis的python读取要素的X,Y方法
Dec 22 Python
Python基于mysql实现学生管理系统
Feb 21 Python
用python3读取python2的pickle数据方式
Dec 25 Python
Python使用type动态创建类操作示例
Feb 29 Python
python3 循环读取excel文件并写入json操作
Jul 14 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数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
2014/06/19 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
PHP文件上传处理案例分析
2016/10/15 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
PHP7原生MySQL数据库操作实现代码
2020/07/03 PHP
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
jQuery晃动层特效实现方法
2015/03/09 Javascript
JavaScript实现自动变换表格边框颜色
2015/05/08 Javascript
JavaScript头像上传插件源码分享
2016/03/29 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
2016/08/08 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
Python中使用HTMLParser解析html实例
2015/02/08 Python
Python编写屏幕截图程序方法
2015/02/18 Python
详解Python中的日志模块logging
2015/06/19 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
Flask 上传自定义头像的实例详解
2020/01/09 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
CSS3实现歌词进度文字颜色填充变化动态效果的思路详解
2020/06/02 HTML / CSS
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
Chemist Warehouse中文网:澳洲连锁大药房
2021/02/05 全球购物
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
学校招生宣传广告词
2014/03/19 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
2014年度思想工作总结
2014/11/27 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
2016新年问候语大全
2015/11/11 职场文书
导游词之凤凰古城
2019/10/22 职场文书
javascript之Object.assign()的痛点分析
2022/03/03 Javascript
macos系统如何实现微信双开? mac登录两个微信以上微信的技巧
2022/07/23 数码科技