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抓取京东图书评论数据
Aug 31 Python
python如何在终端里面显示一张图片
Aug 17 Python
详解Python实现按任意键继续/退出的功能
Aug 19 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
python matlibplot绘制3D图形
Jul 02 Python
对python读取zip压缩文件里面的csv数据实例详解
Feb 08 Python
使用python获取邮箱邮件的设置方法
Sep 20 Python
python 爬取疫情数据的源码
Feb 09 Python
Python3打包exe代码2种方法实例解析
Feb 17 Python
解决Python pip 自动更新升级失败的问题
Feb 21 Python
python用opencv 图像傅里叶变换
Jan 04 Python
python 使用pandas读取csv文件的方法
Dec 24 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 return语句另类用法不止是在函数中
2014/09/17 PHP
php类的扩展和继承用法实例
2015/06/20 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
发现的以前不知道的函数
2006/09/19 Javascript
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
Extjs学习笔记之六 面版
2010/01/08 Javascript
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
python中的字典使用分享
2016/07/31 Python
python非递归全排列实现方法
2017/04/10 Python
Python文本处理之按行处理大文件的方法
2018/04/09 Python
python logging模块书写日志以及日志分割详解
2019/07/22 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
.dcm格式文件软件读取及python处理详解
2020/01/16 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
关于前端上传文件全面基础扫盲贴(入门)
2019/08/01 HTML / CSS
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
N.Peal官网:来自伦敦的高档羊绒品牌
2018/10/29 全球购物
大学专科自荐信
2014/06/17 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
岳麓书院导游词
2015/02/03 职场文书
表扬信格式模板
2015/05/05 职场文书