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 相关文章推荐
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
python利用rsa库做公钥解密的方法教程
Dec 10 Python
python中将\\uxxxx转换为Unicode字符串的方法
Sep 06 Python
如何使用Python实现自动化水军评论
Jun 26 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
Aug 06 Python
Python+numpy实现矩阵的行列扩展方式
Nov 29 Python
python 循环数据赋值实例
Dec 02 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 Python
Pandas DataFrame求差集的示例代码
Dec 13 Python
python+selenium自动化实战携带cookies模拟登陆微博
Jan 19 Python
教你怎么用python实现字符串转日期
May 24 Python
python 远程执行命令的详细代码
Feb 15 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递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
javascript中expression的用法整理
2014/05/13 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
基于JavaScript实现动态添加删除表格的行
2016/02/01 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
AngularJS实现单独作用域内的数据操作
2016/09/05 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
jQuery插件Echarts实现的渐变色柱状图
2017/03/23 jQuery
Javascript 严格模式use strict详解
2017/09/16 Javascript
在Vue中使用Compass的方法
2018/03/02 Javascript
解决vue-cli3 使用子目录部署问题
2018/07/19 Javascript
详解webpack自定义loader初探
2018/08/29 Javascript
VUE写一个简单的表格实例
2019/08/06 Javascript
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
python实现数通设备端口监控示例
2014/04/02 Python
Python线程的两种编程方式
2015/04/14 Python
python字符串对其居中显示的方法
2015/07/11 Python
Python单例模式实例详解
2017/03/01 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
2019/04/09 Python
python实现跨年表白神器--你值得拥有
2021/01/04 Python
AmazeUI 列表的实现示例
2020/08/17 HTML / CSS
总裁岗位职责
2013/12/04 职场文书
班组长安全职责
2014/01/05 职场文书
农村党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
承诺保证书格式
2015/02/28 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书