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的Tornado框架中session支持的实现代码
Aug 21 Python
常见的python正则用法实例讲解
Jun 21 Python
Python实现的摇骰子猜大小功能小游戏示例
Dec 18 Python
Python实现PS滤镜碎片特效功能示例
Jan 24 Python
Python3使用正则表达式爬取内涵段子示例
Apr 22 Python
[机器视觉]使用python自动识别验证码详解
May 16 Python
Python:Numpy 求平均向量的实例
Jun 29 Python
python set内置函数的具体使用
Jul 02 Python
pandas 如何分割字符的实现方法
Jul 29 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
关于tensorflow softmax函数用法解析
Jun 30 Python
python 制作网站小说下载器
Feb 20 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
使用网络地址转换实现多服务器负载均衡
2006/10/09 PHP
PHP 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
mysql desc(DESCRIBE)命令实例讲解
2016/09/24 PHP
详解php中curl返回false的解决办法
2019/03/18 PHP
jquery $.ajax入门应用二
2008/11/19 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
有关javascript的性能优化 (repaint和reflow)
2013/04/12 Javascript
js Math 对象的方法
2013/09/01 Javascript
判断一个变量是数组Array类型的方法
2013/09/16 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
2017/02/10 Javascript
jquery 仿锚点跳转到页面指定位置的实例
2017/02/14 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
vue 组件的封装之基于axios的ajax请求方法
2018/08/11 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
vant实现购物车功能
2020/06/29 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
2021/03/01 Vue.js
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
python验证码识别教程之利用投影法、连通域法分割图片
2018/06/04 Python
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
python 获得任意路径下的文件及其根目录的方法
2019/02/16 Python
pytorch 实现tensor与numpy数组转换
2019/12/27 Python
北京SQL新华信咨询
2016/09/30 面试题
基督教婚礼主持词
2014/03/14 职场文书
廉洁自律承诺书
2014/03/27 职场文书
务工证明怎么写
2015/06/18 职场文书
Python如何使用循环结构和分支结构
2022/04/13 Python