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 struct模块解析
Jun 12 Python
python通过ftplib登录到ftp服务器的方法
May 08 Python
Python用UUID库生成唯一ID的方法示例
Dec 15 Python
Python中单例模式总结
Feb 20 Python
Python爬取成语接龙类网站
Oct 19 Python
python中列表的切片与修改知识点总结
Jul 23 Python
Django实现从数据库中获取到的数据转换为dict
Mar 27 Python
200行python代码实现贪吃蛇游戏
Apr 24 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
Jun 03 Python
python 决策树算法的实现
Oct 09 Python
一文搞懂Python Sklearn库使用
Aug 23 Python
Python IO文件管理的具体使用
Mar 20 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与Mysql的一些简单的操作
2015/02/26 PHP
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
子页向父页传值示例
2013/11/27 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
jquery实现Slide Out Navigation滑出式菜单效果代码
2015/09/07 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
JS实现搜索框文字可删除功能
2016/12/28 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
Python的高级Git库 Gittle
2014/09/22 Python
python使用zip将list转为json的方法
2018/12/31 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
python之列表推导式的用法
2019/11/29 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
Django Path转换器自定义及正则代码实例
2020/05/29 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
C#和SQL Server的面试题
2016/08/12 面试题
如果Session Bean得Remove方法一直都不被调用会怎么样
2012/07/14 面试题
社区党总支书记先进事迹材料
2014/01/24 职场文书
超市总经理岗位职责
2014/02/02 职场文书
数控个人求职信范文
2014/02/03 职场文书
弄虚作假心得体会
2014/09/10 职场文书
mysql sql常用语句大全
2022/06/21 MySQL
Zabbix对Kafka topic积压数据监控的解决方案
2022/07/07 Servers