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使用xauth方式登录饭否网然后发消息
Apr 11 Python
python中的计时器timeit的使用方法
Oct 20 Python
Python多层装饰器用法实例分析
Feb 09 Python
python使用Tesseract库识别验证
Mar 21 Python
django rest framework 数据的查找、过滤、排序的示例
Jun 25 Python
python批量下载抖音视频
Jun 17 Python
pow在python中的含义及用法
Jul 11 Python
基于python二叉树的构造和打印例子
Aug 09 Python
六种酷炫Python运行进度条效果的实现代码
Jul 17 Python
详解python os.path.exists判断文件或文件夹是否存在
Nov 16 Python
Python+Opencv实现把图片、视频互转的示例
Dec 17 Python
Python之京东商品秒杀的实现示例
Jan 06 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和XSS跨站攻击的防范
2007/04/17 PHP
PHP 获取MSN好友列表的代码(2009-05-14测试通过)
2009/09/09 PHP
屏蔽机器人从你的网站搜取email地址的php代码
2012/11/14 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
PHP count()函数讲解
2019/02/03 PHP
简单通用的JS滑动门代码
2008/12/19 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
Angular ng-class详解及实例代码
2016/09/19 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
React Form组件的实现封装杂谈
2018/05/07 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
用python处理MS Word的实例讲解
2018/05/08 Python
Python 类的特殊成员解析
2018/06/20 Python
django项目中使用手机号登录的实例代码
2019/08/15 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
python使用ctypes库调用DLL动态链接库
2020/10/22 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
实习医生自我评价
2013/09/22 职场文书
大四学生思想汇报
2014/01/13 职场文书
用人单位聘用意向书
2015/05/11 职场文书
民事起诉状范文
2015/05/19 职场文书
实习证明格式范文
2015/06/16 职场文书
入党后的感想
2015/08/10 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书
Python编解码问题及文本文件处理方法详解
2021/06/20 Python