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中的__init__ 、__new__、__call__小结
Apr 25 Python
从零学python系列之从文件读取和保存数据
May 23 Python
Python中常用操作字符串的函数与方法总结
Feb 04 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
Feb 08 Python
Python回文字符串及回文数字判定功能示例
Mar 20 Python
使用python画个小猪佩奇的示例代码
Jun 06 Python
在python中使用xlrd获取合并单元格的方法
Dec 26 Python
利用ImageAI库只需几行python代码实现目标检测
Aug 09 Python
详解PyTorch手写数字识别(MNIST数据集)
Aug 16 Python
python里的单引号和双引号的有什么作用
Jun 17 Python
Kmeans均值聚类算法原理以及Python如何实现
Sep 26 Python
Python使用华为API为图像设置多个锚点标签
Apr 12 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实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
DEFER怎么用?
2006/07/01 Javascript
jquery显示和隐藏div特效实例
2013/02/27 Javascript
利用javascript实现web页面中指定区域打印
2013/10/30 Javascript
分享20个提升网站界面体验的jQuery插件
2014/12/15 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
js学习阶段总结(必看篇)
2016/06/16 Javascript
vue.js国际化 vue-i18n插件的使用详解
2017/07/07 Javascript
详解vue渲染函数render的使用
2017/12/12 Javascript
在vue项目创建的后初始化首次使用stylus安装方法分享
2018/01/25 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
JavaScript类型相关的常用操作总结
2019/02/14 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
angularjs请求数据的方法示例
2019/08/06 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
Python及PyCharm下载与安装教程
2017/11/18 Python
详解python之heapq模块及排序操作
2019/04/04 Python
Flask配置Cors跨域的实现
2019/07/12 Python
django rest framework 实现用户登录认证详解
2019/07/29 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
tensorflow 实现数据类型转换
2020/02/17 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
2020/04/03 Python
Python列表如何更新值
2020/05/27 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
机关单位人员学雷锋心得体会
2014/03/10 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
新员工考核评语
2014/12/31 职场文书
迎新生晚会主持词
2015/06/30 职场文书
初中同学会致辞
2015/08/01 职场文书
爱国之歌(8首)
2019/09/29 职场文书