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中实现两个字典(dict)合并的方法
Sep 23 Python
分享Python文本生成二维码实例
Jan 06 Python
python虚拟环境virualenv的安装与使用
Dec 18 Python
Selenium定位元素操作示例
Aug 10 Python
Python实现直方图均衡基本原理解析
Aug 08 Python
python防止随意修改类属性的实现方法
Aug 21 Python
Python实现捕获异常发生的文件和具体行数
Apr 25 Python
浅谈pycharm导入pandas包遇到的问题及解决
Jun 01 Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 Python
Python如何设置指定窗口为前台活动窗口
Aug 12 Python
python爬虫分布式获取数据的实例方法
Nov 26 Python
用PYTHON去计算88键钢琴的琴键频率和音高
Apr 10 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
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
PHP设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
jquery下json数组的操作实现代码
2010/08/09 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
JQuery设置时间段下拉选择实例
2014/12/30 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
2015/01/02 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
jQuery实现锚点scoll效果实例分析
2015/03/10 Javascript
jQuery实现的网页左侧在线客服效果代码
2015/10/23 Javascript
Dojo获取下拉框的文本和值实例代码
2016/05/27 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
基于JS实现的随机数字抽签实例
2016/12/08 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
JavaScript实现简单的树形菜单效果
2017/06/23 Javascript
浅析为什么a="abc" 不等于 a=new String("abc")
2017/10/25 Javascript
IE11下处理Promise及Vue的单项数据流问题
2019/07/24 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
详细分析JavaScript中的深浅拷贝
2020/09/17 Javascript
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
简介Django框架中可使用的各类缓存
2015/07/23 Python
python常用函数详解
2016/09/13 Python
python SMTP实现发送带附件电子邮件
2018/05/22 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
初婚未育证明
2014/01/15 职场文书
《落花生》教学反思
2014/02/25 职场文书
工作决心书
2014/03/11 职场文书
检讨书模板大全
2015/05/07 职场文书
技术入股协议书
2016/03/22 职场文书
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL
在Centos 8.0中安装Redis服务器的教程详解
2022/03/21 Redis