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程序实例(通讯录)
Nov 29 Python
基于python中pygame模块的Linux下安装过程(详解)
Nov 09 Python
解决python3 网络请求路径包含中文的问题
May 10 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
Python+OpenCV采集本地摄像头的视频
Apr 25 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
Apr 29 Python
flask 实现上传图片并缩放作为头像的例子
Jan 09 Python
基于Python爬取爱奇艺资源过程解析
Mar 02 Python
在Python IDLE 下调用anaconda中的库教程
Mar 09 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
Apr 21 Python
python实现二分查找算法
Sep 18 Python
Python 文本滚动播放器的实现代码
Apr 25 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设计模式 Command(命令模式)
2011/06/26 PHP
PHP采集腾讯微博的实现代码
2012/01/19 PHP
基于flush()不能按顺序输出时的解决办法
2013/06/29 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
2016/10/08 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
深入理解angularjs过滤器
2016/05/25 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
python简单判断序列是否为空的方法
2015/06/30 Python
python语言使用技巧分享
2016/05/31 Python
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
使用Python读取大文件的方法
2018/02/11 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
python实现音乐播放器 python实现花框音乐盒子
2020/02/25 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
美国在线家居装饰店:Belle&June
2018/10/24 全球购物
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
如何进行Linux分区优化
2016/09/13 面试题
公司请假条范文
2014/04/11 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
超市开店计划书
2014/09/15 职场文书
实习生辞职信范文
2015/03/02 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
多人股份制合作协议书
2016/03/19 职场文书