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程序实例(通讯录)
Nov 29 Python
Python中实现对list做减法操作介绍
Jan 09 Python
python实现在sqlite动态创建表的方法
May 08 Python
Python修改MP3文件的方法
Jun 15 Python
pandas string转dataframe的方法
Apr 11 Python
详解Python如何生成词云的方法
Jun 01 Python
Python Tkinter模块实现时钟功能应用示例
Jul 23 Python
python的pip安装以及使用教程
Sep 18 Python
Python求离散序列导数的示例
Jul 10 Python
Python Numpy 控制台完全输出ndarray的实现
Feb 19 Python
Python range与enumerate函数区别解析
Feb 28 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 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
一个改进的UBB类
2006/10/09 PHP
缓存技术详谈―php
2006/12/14 PHP
PHP下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
php获取文章内容第一张图片的方法示例
2017/07/03 PHP
浅析PHP开发规范
2018/02/05 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
js控制当再次点击按钮时的间隔时间
2014/06/03 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
使用nodejs下载风景壁纸
2017/02/05 NodeJs
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
2017/03/22 jQuery
js实现城市级联菜单的2种方法
2017/06/23 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
vue 2.x 中axios 封装的get 和post方法
2018/02/28 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
python实现apahce网站日志分析示例
2014/04/02 Python
python绘图方法实例入门
2015/05/19 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
2021/01/22 Python
HTML5移动端手机网站开发流程
2016/04/25 HTML / CSS
C++面试题:关于链表和指针
2013/06/05 面试题
J2EE系统只能是基于web
2015/09/08 面试题
小学生暑假家长评语
2014/04/17 职场文书
中秋手机店促销方案
2014/06/16 职场文书
ktv周年庆活动方案
2014/08/18 职场文书
销售员试用期自我评价
2014/09/15 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
诚信考试主题班会
2015/08/17 职场文书
英镑符号 £
2022/02/17 杂记
python双向链表实例详解
2022/05/25 Python