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 ZipFile模块详解
Nov 01 Python
python访问类中docstring注释的实现方法
May 04 Python
python中requests库session对象的妙用详解
Oct 30 Python
TensorFlow高效读取数据的方法示例
Feb 06 Python
对python中执行DOS命令的3种方法总结
May 12 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 Python
python分数表示方式和写法
Jun 26 Python
Python列表(list)所有元素的同一操作解析
Aug 01 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
python实现ip地址的包含关系判断
Feb 07 Python
python读取文件指定行内容实例讲解
Mar 02 Python
Jupyter notebook如何实现指定浏览器打开
May 13 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中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
PHP下载远程文件到本地存储的方法
2015/03/24 PHP
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
javascript 通用简单的table选项卡实现
2010/05/07 Javascript
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
JavaScript获取页面上某个元素的代码
2011/03/13 Javascript
JQuery里选择超链接的实现代码
2011/05/22 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
2020/05/16 Javascript
jQuery插件开发汇总
2016/05/15 Javascript
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
在微信小程序中保存网络图片
2019/02/12 Javascript
通过Nodejs搭建网站简单实现注册登录流程
2019/06/14 NodeJs
NProgress显示顶部进度条效果及使用详解
2019/09/21 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
[01:50]《我与DAC》之玩家:iG夺冠时的那面红旗
2018/03/29 DOTA
python获取网页状态码示例
2014/03/30 Python
Python和GO语言实现的消息摘要算法示例
2015/03/10 Python
用Python的Django框架来制作一个RSS阅读器
2015/07/22 Python
python回调函数中使用多线程的方法
2017/12/25 Python
python爬虫增加访问量的方法
2019/08/22 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
德国药房apodiscounter中文官网:德国排名前三的网上药店
2019/06/03 全球购物
P D PAOLA意大利官网:西班牙著名的珠宝首饰品牌
2019/09/24 全球购物
世界上最好的野生海鲜和有机食品:Vital Choice
2020/01/16 全球购物
书法培训心得体会
2014/01/05 职场文书
艺术设计专业个人求职信
2014/04/10 职场文书
Python 实现定积分与二重定积分的操作
2021/05/26 Python