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中操作文件之write()方法的使用教程
May 25 Python
在Django的URLconf中进行函数导入的方法
Jul 18 Python
Python编程中的for循环语句学习教程
Oct 14 Python
Python 实现文件的全备份和差异备份详解
Dec 27 Python
python使用fcntl模块实现程序加锁功能示例
Jun 23 Python
Python迭代器定义与简单用法分析
Apr 30 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
Dec 25 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
Mar 09 Python
python爬虫分布式获取数据的实例方法
Nov 26 Python
python用700行代码实现http客户端
Jan 14 Python
python 模拟在天空中放风筝的示例代码
Apr 21 Python
Python实战实现爬取天气数据并完成可视化分析详解
Jun 16 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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
PHP的分页功能
2007/03/21 PHP
php下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
php数据库抽象层 PDO
2011/05/07 PHP
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
php打造属于自己的MVC框架
2012/03/07 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
Prototype Array对象 学习
2009/07/19 Javascript
JQuery Ajax 跨域访问的解决方案
2010/03/12 Javascript
jQuery页面加载初始化常用的三种方法
2014/06/04 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
2014/09/22 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
JavaScript自定义等待wait函数实例分析
2015/03/23 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
bootstrap paginator分页前后台用法示例
2017/06/17 Javascript
jQuery实现选中行变色效果(实例讲解)
2017/07/06 jQuery
详解react服务端渲染(同构)的方法
2017/09/21 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
2018/11/30 Python
CSS3等相关属性制作分页导航实现代码
2012/12/24 HTML / CSS
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
Chantelle仙黛尔内衣美国官网:法国第一品牌内衣
2018/07/26 全球购物
extern在函数声明中是什么意思
2014/01/19 面试题
最新远光软件笔试题面试题内容
2013/11/08 面试题
幼儿园数学教学反思
2014/02/02 职场文书
高中生家长寄语大全
2014/04/03 职场文书
学术研讨会欢迎词
2015/01/26 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
个人承诺书格式范文
2015/04/29 职场文书