Python使用functools模块中的partial函数生成偏函数


Posted in Python onJuly 02, 2016

python 中提供一种用于对函数固定属性的函数(与数学上的偏函数不一样)

# 通常会返回10进制
int('12345')  # print 12345 

# 使用参数 返回 8进制
int('11111', 8)  # print 4681

每次都得添加参数比较麻烦, functools提供了partial的方法

import functools

foo = functools.partial(int, base=8)

foo('11111')  # print 4681

通过这种方法生成一个固定参数的新函数.

假设要转换大量的二进制字符串,每次都传入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。

Python 相关文章推荐
python构造icmp echo请求和实现网络探测器功能代码分享
Jan 10 Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 Python
Python json模块dumps、loads操作示例
Sep 06 Python
实例分析python3实现并发访问水平切分表
Sep 29 Python
在python中实现将一张图片剪切成四份的方法
Dec 05 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
Dec 18 Python
python从list列表中选出一个数和其对应的坐标方法
Jul 20 Python
对Django中内置的User模型实例详解
Aug 16 Python
python中bytes和str类型的区别
Oct 21 Python
nginx+uwsgi+django环境搭建的方法步骤
Nov 25 Python
Python ini文件常用操作方法解析
Apr 26 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
Apr 11 Python
Python之父谈Python的未来形式
Jul 01 #Python
举例讲解Python的lambda语句声明匿名函数的用法
Jul 01 #Python
Python内置数据结构与操作符的练习题集锦
Jul 01 #Python
Python设置默认编码为utf8的方法
Jul 01 #Python
Python使用email模块对邮件进行编码和解码的实例教程
Jul 01 #Python
详解Python中使用base64模块来处理base64编码的方法
Jul 01 #Python
Python画图学习入门教程
Jul 01 #Python
You might like
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
2019/12/04 PHP
PHP生成图表pChart的示例解析
2020/07/31 PHP
JavaScript 解析Json字符串的性能比较分析代码
2009/12/16 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
jquery cookie实现的简单换肤功能适合小网站
2013/08/25 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
vue系列之requireJs中引入vue-router的方法
2018/07/18 Javascript
webpack3.0升级4.0的方法步骤
2020/04/02 Javascript
python选择排序算法的实现代码
2013/11/21 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
Python GUI布局尺寸适配方法
2018/10/11 Python
python取数作为临时极大值(极小值)的方法
2018/10/15 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
2019/10/18 Python
pytorch标签转onehot形式实例
2020/01/02 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
新大陆软件面试题
2016/11/24 面试题
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
小加工厂管理制度
2014/01/21 职场文书
手机银行营销方案
2014/03/14 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
新教师培训心得体会
2014/09/02 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
2014年办公室工作总结范文
2014/11/12 职场文书
综合素质自我评价评语
2015/03/06 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
高中数学教学反思范文
2016/02/18 职场文书
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python