详细介绍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 29 Python
python获取当前计算机cpu数量的方法
Apr 18 Python
python学习之编写查询ip程序
Feb 27 Python
Python对列表去重的多种方法(四种方法)
Dec 05 Python
python使用锁访问共享变量实例解析
Feb 08 Python
对python requests的content和text方法的区别详解
Oct 11 Python
Python OpenCV 使用滑动条来调整函数参数的方法
Jul 08 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 Python
parser.add_argument中的action使用
Apr 20 Python
opencv 图像加法与图像融合的实现代码
Jul 08 Python
python 模拟登录B站的示例代码
Dec 15 Python
Python中的 enumerate和zip详情
May 30 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
解析mysql left( right ) join使用on与where筛选的差异
2013/06/18 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
2014/07/30 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
2019/10/17 PHP
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
js实现带圆角的多级下拉菜单效果
2015/08/28 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
javascript显示系统当前时间代码
2016/12/29 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
vue和webpack打包项目相对路径修改的方法
2018/06/15 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
解决layui弹框失效的问题
2019/09/09 Javascript
Vue 3.0中jsx语法的使用
2020/11/13 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
如何在JavaScript中使用localStorage详情
2021/02/04 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
[15:57]教你分分钟做大人:斧王
2014/10/30 DOTA
Python对List中的元素排序的方法
2018/04/01 Python
python爬取网易云音乐评论
2018/11/16 Python
python 使用shutil复制图片的例子
2019/12/13 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
NBA欧洲商店(法国):NBA Europe Store FR
2016/10/19 全球购物
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
无违反计划生育证明格式
2015/06/24 职场文书
react如何快速设置文件路径别名
2021/04/28 Javascript
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL
详解Vue的列表渲染
2021/11/20 Vue.js