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 random模块常用方法
Nov 03 Python
Python的Bottle框架中实现最基本的get和post的方法的教程
Apr 30 Python
python引用DLL文件的方法
May 11 Python
解决python使用open打开文件中文乱码的问题
Dec 29 Python
python实现生命游戏的示例代码(Game of Life)
Jan 24 Python
浅谈Django的缓存机制
Aug 23 Python
简单了解python反射机制的一些知识
Jul 13 Python
python django下载大的csv文件实现方法分析
Jul 19 Python
使用Python的datetime库处理时间(RPA流程)
Nov 24 Python
python破解同事的压缩包密码
Oct 14 Python
python实现企业微信定时发送文本消息的示例代码
Nov 24 Python
Python+Appium实现自动抢微信红包
May 21 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连接oracle数据库及查询数据的方法
2014/12/29 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
php,js,css字符串截取的办法集锦
2014/09/26 Javascript
JavaScript函数详解
2015/02/27 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
javascript解三阶幻方(九宫格)
2015/04/22 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
原生JavaScript实现Ajax异步请求
2017/11/19 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
vue单页缓存方案分析及实现
2018/09/25 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
Js实现复选框的全选、全不选反选功能代码实例
2020/02/28 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
Python使用PIL模块生成随机验证码
2017/11/21 Python
Python面向对象之反射/自省机制实例分析
2018/08/24 Python
用xpath获取指定标签下的所有text的实例
2019/01/02 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
六一节目主持词
2014/04/01 职场文书
工厂车间标语
2014/06/19 职场文书
社区服务活动小结
2014/07/08 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
英文版辞职信
2015/02/28 职场文书
初中团委工作总结
2015/08/13 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
自动在Windows中运行Python脚本并定时触发功能实现
2021/09/04 Python
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL