详细介绍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下singleton模式的实现方法
Jul 16 Python
python自动化测试实例解析
Sep 28 Python
Windows下Python的Django框架环境部署及应用编写入门
Mar 10 Python
python的Tqdm模块的使用
Jan 10 Python
python编写弹球游戏的实现代码
Mar 12 Python
对numpy中array和asarray的区别详解
Apr 17 Python
Python实现随机生成手机号及正则验证手机号的方法
Apr 25 Python
在python中,使用scatter绘制散点图的实例
Jul 03 Python
python tkinter图形界面代码统计工具
Sep 18 Python
python如何实现不用装饰器实现登陆器小程序
Dec 14 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
Mar 30 Python
Python logging模块原理解析及应用
Aug 13 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 array 的加法操作代码
2010/07/24 PHP
php调用google接口生成二维码示例
2014/04/28 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
用js实现计算加载页面所用的时间
2010/04/02 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
浅谈JavaScript_DOM学习篇_图片切换小案例
2019/03/19 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
Python绘图之柱形图绘制详解
2020/07/28 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
html5 css3 动态气泡按钮实例演示
2012/12/02 HTML / CSS
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
大学生简单自荐信
2013/11/10 职场文书
生物学学生自我评价
2014/01/17 职场文书
求职信的正确写法
2014/07/10 职场文书
2014年青年志愿者工作总结
2014/12/09 职场文书
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
详解Python中下划线的5种含义
2021/07/15 Python
vue3.0 数字翻牌组件的使用方法详解
2022/04/20 Vue.js