详细介绍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实现带验证码网站的自动登陆实现代码
Jan 12 Python
Python实现把回车符\r\n转换成\n
Apr 23 Python
举例讲解Python中的Null模式与桥接模式编程
Feb 02 Python
Python数据分析之真实IP请求Pandas详解
Nov 18 Python
Python3.x对JSON的一些操作示例
Sep 01 Python
对pandas中to_dict的用法详解
Jun 05 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
python实现图片中文字分割效果
Jul 22 Python
python3实现绘制二维点图
Dec 04 Python
深入理解python多线程编程
Apr 18 Python
python基础之while循环语句的使用
Apr 20 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/08/18 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
编写安全 PHP应用程序的七个习惯深入分析
2013/06/08 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
麻雀虽小五脏俱全 Dojo自定义控件应用
2010/09/04 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
老生常谈遮罩层 滚动条的问题
2016/04/29 Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
2016/06/12 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
JS实现简易刻度时钟示例代码
2017/03/11 Javascript
Vue.use源码分析
2017/04/22 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
node.js 模块和其下载资源的镜像设置的方法
2018/09/06 Javascript
浅谈js闭包理解
2019/03/28 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
基于javascript实现放大镜特效
2020/12/03 Javascript
python Django连接MySQL数据库做增删改查
2013/11/07 Python
Python:slice与indices的用法
2019/11/25 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
国际知名军事风格休闲装品牌:Alpha Industries(阿尔法工业)
2017/05/24 全球购物
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
爱尔兰电脑、家电和家具购物网站:Buy It Direct
2019/07/09 全球购物
自荐信怎么写呢?
2013/12/09 职场文书
地球一小时倡议书
2014/04/15 职场文书
铣工实训报告
2014/11/05 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
SpringBoot使用ip2region获取地理位置信息的方法
2022/06/21 Java/Android