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中用pycurl监控http响应时间脚本分享
Feb 02 Python
举例讲解Python面向对象编程中类的继承
Jun 17 Python
python中csv文件的若干读写方法小结
Jul 04 Python
详解python的sorted函数对字典按key排序和按value排序
Aug 10 Python
Python操作注册表详细步骤介绍
Feb 05 Python
pyqt5中动画的使用详解
Apr 01 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
python 使用事件对象asyncio.Event来同步协程的操作
May 04 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
Jul 03 Python
基于logstash实现日志文件同步elasticsearch
Aug 06 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
Dec 09 Python
教你怎么用Python实现多路径迷宫
Apr 29 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实现图片添加水印功能
2014/02/13 PHP
ThinkPHP采用原生query实现关联查询left join实例
2014/12/02 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
php文件后缀不强制为.php的实操方法
2019/09/18 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
javascript web页面刷新的方法收集
2009/07/02 Javascript
js生成的验证码的实现与技术分析
2014/09/17 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
NodeJs实现简易WEB上传下载服务器
2019/08/10 NodeJs
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
Python爬取京东的商品分类与链接
2016/08/26 Python
python threading和multiprocessing模块基本用法实例分析
2019/07/25 Python
python ctypes库2_指定参数类型和返回类型详解
2019/11/19 Python
Django app配置多个数据库代码实例
2019/12/17 Python
Django crontab定时任务模块操作方法解析
2020/09/10 Python
斯福泰克软件测试面试题
2015/02/16 面试题
优秀实习自我鉴定
2013/12/04 职场文书
个人工作主要事迹
2014/05/08 职场文书
小学数学课题方案
2014/06/15 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
员工辞职信范文
2015/03/02 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
Redis 常见使用场景
2021/08/30 Redis
win10清理dns缓存
2022/04/19 数码科技