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程序设计入门(3)数组的使用
Jun 16 Python
Python下使用Psyco模块优化运行速度
Apr 05 Python
Python实现身份证号码解析
Sep 01 Python
深入源码解析Python中的对象与类型
Dec 11 Python
Centos部署django服务nginx+uwsgi的方法
Jan 02 Python
Python告诉你木马程序的键盘记录原理
Feb 02 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
详解python websocket获取实时数据的几种常见链接方式
Jul 01 Python
Flask项目中实现短信验证码和邮箱验证码功能
Dec 05 Python
python两个_多个字典合并相加的实例代码
Dec 26 Python
Python调用shell cmd方法代码示例解析
Jun 18 Python
一篇文章搞懂python混乱的切换操作与优雅的推导式
Aug 23 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正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
解决 firefox 不支持 document.all的方法
2007/03/12 Javascript
封装好的省市地区联动控件附下载
2007/08/13 Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
JavaScript全局函数使用简单说明
2011/03/11 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
vue用递归组件写树形控件的实例代码
2018/07/19 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
图解javascript作用域链
2019/05/27 Javascript
js实现秒表计时器
2019/12/16 Javascript
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
[01:00:44]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第三局
2016/03/04 DOTA
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
pandas 取出表中一列数据所有的值并转换为array类型的方法
2018/04/11 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
python银行系统实现源码
2019/10/25 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
HTML5标签与HTML4标签的区别示例介绍
2013/07/18 HTML / CSS
HTML5 canvas基本绘图之填充样式实现
2016/06/27 HTML / CSS
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
文明寄语大全
2014/04/11 职场文书
QQ空间主人寄语大全
2014/04/12 职场文书
心理健康活动总结
2014/04/30 职场文书
销售内勤岗位职责
2015/02/10 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书