Python中functools模块函数解析


Posted in Python onMarch 12, 2017

Python自带的 functools 模块提供了一些常用的高阶函数,也就是用于处理其它函数的特殊函数。换言之,就是能使用该模块对可调用对象进行处理。

functools模块函数概览

  • functools.cmp_to_key(func)
  • functools.total_ordering(cls)
  • functools.reduce(function, iterable[, initializer])
  • functools.partial(func[, args][, *keywords])
  • functools.update_wrapper(wrapper, wrapped[, assigned][, updated])
  • functools.wraps(wrapped[, assigned][, updated])

functools.cmp_to_key()

语法:

functools.cmp_to_key(func) 

该函数用于将旧式的比较函数转换为关键字函数。

旧式的比较函数:接收两个参数,返回比较的结果。返回值小于零则前者小于后者,返回值大于零则相反,返回值等于零则两者相等。

关键字函数:接收一个参数,返回其对应的可比较对象。例如 sorted(), min(), max(), heapq.nlargest(), heapq.nsmallest(), itertools.groupby() 都可作为关键字函数。

在 Python 3 中,有很多地方都不再支持旧式的比较函数,此时可以使用 cmp_to_key() 进行转换。

示例:

sorted(iterable, key=cmp_to_key(cmp_func))

functools.total_ordering()

语法:

functools.total_ordering(cls) 

这是一个类装饰器,用于自动实现类的比较运算。

我们只需要在类中实现 __eq__() 方法和以下方法中的任意一个 __lt__(), __le__(), __gt__(), __ge__(),那么 total_ordering() 就能自动帮我们实现余下的几种比较运算。

示例:

@total_ordering
class Student: 
  def __eq__(self, other):
    return ((self.lastname.lower(), self.firstname.lower()) ==
        (other.lastname.lower(), other.firstname.lower()))
  def __lt__(self, other):
    return ((self.lastname.lower(), self.firstname.lower()) <
        (other.lastname.lower(), other.firstname.lower()))

functools.reduce()

语法:

functools.reduce(function, iterable[, initializer]) 

该函数与 Python 内置的 reduce() 函数相同,主要用于编写兼容 Python 3 的代码。

functools.partial()

语法:

functools.partial(func[, *args][, **keywords]) 

该函数返回一个 partial 对象,调用该对象的效果相当于调用 func 函数,并传入位置参数 args 和关键字参数 keywords 。如果调用该对象时传入了位置参数,则这些参数会被添加到 args 中。如果传入了关键字参数,则会被添加到 keywords 中。

partial() 函数的等价实现大致如下:

def partial(func, *args, **keywords): 
  def newfunc(*fargs, **fkeywords):
    newkeywords = keywords.copy()
    newkeywords.update(fkeywords)
    return func(*(args + fargs), **newkeywords)
  newfunc.func = func
  newfunc.args = args
  newfunc.keywords = keywords
  return newfunc

partial() 函数主要用于“冻结”某个函数的部分参数,返回一个参数更少、使用更简单的函数对象。

示例:

>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo.__doc__ = 'Convert base 2 string to an int.'
>>> basetwo('10010')
18

functools.update_wrapper()

语法:

functools.update_wrapper(wrapper, wrapped[, assigned][, updated]) 

该函数用于更新包装函数(wrapper),使它看起来像原函数一样。可选的参数是一个元组,assigned 元组指定要直接使用原函数的值进行替换的属性,updated 元组指定要对照原函数进行更新的属性。这两个参数的默认值分别是模块级别的常量:WRAPPER_ASSIGNMENTS 和 WRAPPER_UPDATES。前者指定了对包装函数的 __name__, __module__, __doc__ 属性进行直接赋值,而后者指定了对包装函数的 __dict__ 属性进行更新。

该函数主要用于装饰器函数的定义中,置于包装函数之前。如果没有对包装函数进行更新,那么被装饰后的函数所具有的元信息就会变为包装函数的元信息,而不是原函数的元信息。

functools.wraps()

语法:

functools.wraps(wrapped[, assigned][, updated]) 

wraps() 简化了 update_wrapper() 函数的调用。它等价于 partial(update_wrapper, wrapped=wrapped, assigned, updated=updated)。

示例:

>>> from functools import wraps
>>> def my_decorator(f):
...   @wraps(f)
...   def wrapper(*args, **kwds):
...     print 'Calling decorated function'
...     return f(*args, **kwds)
...   return wrapper

>>> @my_decorator
... def example():
...   """Docstring"""
...   print 'Called example function'

>>> example()
Calling decorated function 
Called example function 
>>> example.__name__
'example' 
>>> example.__doc__
'Docstring'

如果不使用这个函数,示例中的函数名就会变成 wrapper ,并且原函数 example() 的说明文档(docstring)就会丢失。

Python 相关文章推荐
python中将阿拉伯数字转换成中文的实现代码
May 19 Python
python获得图片base64编码示例
Jan 16 Python
详解Python的单元测试
Apr 28 Python
Python数据类型学习笔记
Jan 13 Python
使用python实现ANN
Dec 20 Python
浅析Python3爬虫登录模拟
Feb 07 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
Apr 02 Python
Python 图像对比度增强的几种方法(小结)
Sep 25 Python
Python 获取项目根路径的代码
Sep 27 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
Feb 07 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
Apr 24 Python
python中Ansible模块的Playbook的具体使用
May 28 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 #Python
Python中str.format()详解
Mar 12 #Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
Mar 12 #Python
Python中关键字nonlocal和global的声明与解析
Mar 12 #Python
Python中模块string.py详解
Mar 12 #Python
Python中第三方库Requests库的高级用法详解
Mar 12 #Python
python 获取网页编码方式实现代码
Mar 11 #Python
You might like
基于PHP与XML的PDF文档生成技术
2006/10/09 PHP
PHP实现把数字ID转字母ID
2013/08/12 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
PHP的Yii框架中Model模型的学习教程
2016/03/29 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
php自定义时间转换函数示例
2016/12/07 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
IE8提示Invalid procedure call or argument 异常的解决方法
2012/09/30 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
jquery实现浮动的侧栏实例
2015/06/25 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
2015/06/26 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
详解使用create-react-app快速构建React开发环境
2018/05/16 Javascript
js html实现计算器功能
2018/11/13 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
2020/12/25 Vue.js
[49:07]VGJ.T vs Optic Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
python数组复制拷贝的实现方法
2015/06/09 Python
python fabric实现远程部署
2017/01/05 Python
Python用threading实现多线程详解
2017/02/03 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
学习和使用python的13个理由
2019/07/30 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
python os.path.isfile 的使用误区详解
2019/11/29 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
2020/05/25 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
2020/06/17 Python
html5与css3小应用
2013/04/03 HTML / CSS
美国豪华的多品牌精品店:The Webster
2019/07/31 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
《赶海》教学反思
2014/04/20 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
如何用JS实现简单的数据监听
2021/05/06 Javascript
Python3 如何开启自带http服务
2021/05/18 Python