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查询阿里巴巴关键字排名的方法
Jul 08 Python
用python写的一个wordpress的采集程序
Feb 27 Python
Django的分页器实例(paginator)
Dec 01 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 Python
django缓存配置的几种方法详解
Jul 16 Python
matplotlib给子图添加图例的方法
Aug 03 Python
python使用 request 发送表单数据操作示例
Sep 25 Python
python之MSE、MAE、RMSE的使用
Feb 24 Python
Python实现AI自动抠图实例解析
Mar 05 Python
Python中使用socks5设置全局代理的方法示例
Apr 15 Python
Pandas中DataFrame基本函数整理(小结)
Jul 20 Python
Python collections模块的使用方法
Oct 09 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
消息持续发送的完整例子
2006/10/09 PHP
php中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
php获取错误信息的方法
2015/07/17 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
2018/08/04 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
javascript中使用replaceAll()函数实现字符替换的方法
2010/12/25 Javascript
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
解决VUEX刷新的时候出现数据消失
2017/07/03 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
[jQuery] 事件和动画详解
2019/03/05 jQuery
解决layer弹出层自适应页面大小的问题
2019/09/16 Javascript
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
matplotlib中legend位置调整解析
2017/12/19 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
python实现矩阵打印
2019/03/02 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
python实现查找所有程序的安装信息
2020/02/18 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
医药工作岗位求职信分享
2013/12/31 职场文书
教师年度考核评语
2014/04/28 职场文书
幼儿学前班评语
2014/12/29 职场文书
运动会广播稿100字
2015/08/19 职场文书
古诗之感恩老师
2019/10/24 职场文书
javascript canvas实现雨滴效果
2021/06/09 Javascript