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实现通过微信搜索功能查看谁把你删除了
Jan 27 Python
Python内存管理方式和垃圾回收算法解析
Nov 11 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 Python
对Python的多进程锁的使用方法详解
Feb 18 Python
利用python如何在前程无忧高效投递简历
May 07 Python
python-pyinstaller、打包后获取路径的实例
Jun 10 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
Jul 15 Python
Python 模拟动态产生字母验证码图片功能
Dec 24 Python
python 日志模块 日志等级设置失效的解决方案
May 26 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
Jun 18 Python
python BeautifulSoup库的安装与使用
Dec 17 Python
python之np.argmax()及对axis=0或者1的理解
Jun 02 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与ASP
2006/10/09 PHP
php win下Socket方式发邮件类
2009/08/21 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
JS 获取浏览器和屏幕宽高等信息的实现思路及代码
2013/07/31 Javascript
AngularJS基础知识
2014/12/21 Javascript
JavaScript设置body高度为浏览器高度的方法
2015/02/09 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
JavaScript实现网页下拉菜单效果
2020/11/20 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
python 图片验证码代码
2008/12/07 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
django-allauth入门学习和使用详解
2019/07/03 Python
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
什么是岗位职责
2013/11/12 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
主要领导对照检查材料
2014/08/26 职场文书
法院授权委托书格式
2014/09/28 职场文书
教师网络培训心得体会
2016/01/09 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
python实现的人脸识别打卡系统
2021/05/08 Python
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python
Java字符串逆序方法详情
2022/03/21 Java/Android
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
2022/06/14 MySQL