python中partial()基础用法说明


Posted in Python onDecember 30, 2018

前言

一个函数可以有多个参数,而在有的情况下有的参数先得到,有的参数需要在后面的情景中才能知道,python 给我们提供了partial函数用于携带部分参数生成一个新函数。

在functools模块中有一个工具partial(),可以用来"冻结"一个函数的参数,并返回"冻结"参数后的新函数。

很简单的解释,也是官方手册给的示例。对于int()函数,它可以将给定的数值转换成十进制整数,转换时可以指定以几进制的方式解析给定的数。例如:

# 以10进制解析123,并转换成10进制整数
>>> int("123")
123

# 以2进制解析10101,并转换成10进制整数
>>> int("10101", base=2)
21

# 以13进制解析"abc12c",并转换成10进制整数
>>> int("abc12c", base=13)
4053672

现在不想这样指定base=2参数来将二进制转换为10进制整数了,而是像普通函数一样,直接指定待转换的值即可。于是,定义另外一个函数来封装int(),例如:

def inttwo(x):
 return int(x, base=2)

inttwo("10101")

functools中提供的partial()就是做类似事情的:

inttwo = partial(int, base=2)

它表示int()中指定参数base=2,也就是"冻结"了这个参数。

>>> from functools import partial
>>> inttwo = partial(int,base=2)
>>> inttwo("10101")
21

之所以"冻结"加上了引号,是因为可以在inttwo()中再次指定参数来覆盖partial()中"冻结"的参数:

>>> inttwo("10101",base=10)
10101

回头再看partial()的定义:

functools.partial(func, *args, **keywords)

从它的定义不难知道,不仅仅是像int()中base这样的kw参数格式,位置参数args也一样能"冻结"。

partial()返回的其实是一个partial对象,这个对象包含了3个特殊的属性:

>>> dir(inttwo)
[...... 'args', 'func', 'keywords']
  • func表示该对象所封装的原始函数
  • args表示"冻结"的位置参数列表
  • keywords表示"冻结"的关键字参数
>>> inttwo.func
<class 'int'>
>>> inttwo.args
()
>>> inttwo.keywords
{'base': 2}

另外需要注意的是,partial()不会保留封装函数的元数据,比如注释文档、注解等。

>>> def myfunc(x:int, y:int) -> int:
...  ''' sum x + y '''
...  return x + y


# 函数元数据信息
>>> myfunc.__doc__
' sum x + y '
>>> myfunc.__annotations__
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}

# partial()包装后的函数,没有函数元数据
>>> newfunc = functools.partial(myfunc,y=3)

所以如果需要这些元数据,必须自己手动将元数据赋值给partial对象:

>>> newfunc.__doc__ = myfunc.__doc__
>>> newfunc.__annotations__ = myfunc.__annotations__
>>> newfunc.__doc__
' sum x + y '
>>> newfunc.__annotations__
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}

最后,除了partial()可以将函数的参数"冻结",functools还提供了partialmethod()将方法的参数"冻结",但基本上用不上,就连partial()也很少用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python实现的简单FTP上传下载文件实例
Jun 30 Python
Python黑帽编程 3.4 跨越VLAN详解
Sep 28 Python
Python爬取qq music中的音乐url及批量下载
Mar 23 Python
Python编程之微信推送模板消息功能示例
Aug 21 Python
Python中生成器和迭代器的区别详解
Feb 10 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
python读取文件指定行内容实例讲解
Mar 02 Python
python小白学习包管理器pip安装
Jun 09 Python
Python+Kepler.gl实现时间轮播地图过程解析
Jul 20 Python
python实现测试工具(一)——命令行发送get请求
Oct 19 Python
python pyhs2 的安装操作
Apr 07 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
May 30 Python
python读取各种文件数据方法解析
Dec 29 #Python
python 读取鼠标点击坐标的实例
Dec 29 #Python
对python for 文件指定行读写操作详解
Dec 29 #Python
Python实现二维曲线拟合的方法
Dec 29 #Python
python修改txt文件中的某一项方法
Dec 29 #Python
神经网络相关之基础概念的讲解
Dec 29 #Python
Python实现的KMeans聚类算法实例分析
Dec 29 #Python
You might like
php获取文件名后缀常用方法小结
2015/02/24 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
PHP中addcslashes与stripcslashes函数用法分析
2016/01/07 PHP
PHP 断点续传实例详解
2017/11/11 PHP
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
vue组件中传值EventBus的使用及注意事项说明
2020/11/16 Javascript
python使用urlparse分析网址中域名的方法
2015/04/15 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
介绍一下如何优化MySql
2016/12/20 面试题
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
医学生个人求职信范文
2014/02/07 职场文书
公司营业员的自我评价
2014/03/04 职场文书
知名企业招聘广告词大全
2014/03/18 职场文书
小学班主任寄语大全
2014/04/04 职场文书
六年级学生评语
2014/04/22 职场文书
幼儿园家长安全责任书
2014/07/22 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
常住证明范本
2015/06/23 职场文书
幼儿园庆元旦主持词
2015/07/06 职场文书