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 30 Python
在Python中使用成员运算符的示例
May 13 Python
Python pickle模块用法实例分析
May 27 Python
Python 的描述符 descriptor详解
Feb 27 Python
Python 异常处理的实例详解
Sep 11 Python
django_orm查询性能优化方法
Aug 20 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
django框架基于模板 生成 excel(xls) 文件操作示例
Jun 19 Python
Python read函数按字节(字符)读取文件的实现
Jul 03 Python
Python 给定的经纬度标注在地图上的实现方法
Jul 05 Python
python中自带的三个装饰器的实现
Nov 08 Python
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
Apr 27 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
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
ThinkPHP3.1新特性之内容解析输出详解
2014/06/19 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
2014/12/09 PHP
PHP的Yii框架入门使用教程
2016/02/15 PHP
php 实现进制相互转换
2016/04/07 PHP
PHP生成及获取JSON文件的方法
2016/08/23 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
javascript实现日历控件(年月日关闭按钮)
2012/12/12 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
ES6学习教程之模板字符串详解
2017/10/09 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
python搜索指定目录的方法
2015/04/29 Python
Python类属性与实例属性用法分析
2015/05/09 Python
Python基于有道实现英汉字典功能
2015/07/25 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
Python 迭代器工具包【推荐】
2016/05/06 Python
基于python指定包的安装路径方法
2018/10/27 Python
Python逐行读取文件中内容的简单方法
2019/02/26 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
2019/06/25 Python
容易被忽略的Python内置类型
2020/09/03 Python
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
德国电子商城:ComputerUniverse
2017/04/21 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
2013年员工自我评价范文
2013/12/27 职场文书
美德好少年事迹材料
2014/01/19 职场文书
乔迁宴答谢词
2014/01/21 职场文书
党员公开承诺书
2014/03/25 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/09/30 职场文书
于丹论语心得观后感
2015/06/15 职场文书
springboot layui hutool Excel导入的实现
2022/03/31 Java/Android