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+django实现简单的文件上传
Aug 17 Python
python微信跳一跳系列之棋子定位像素遍历
Feb 26 Python
Python迭代器与生成器基本用法分析
Jul 26 Python
Python随机生成身份证号码及校验功能
Dec 04 Python
对Python实现简单的API接口实例讲解
Dec 10 Python
Python面向对象程序设计类的封装与继承用法示例
Apr 12 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
解决pyqt5异常退出无提示信息的问题
Apr 08 Python
tensorflow 大于某个值为1,小于为0的实例
Jun 30 Python
使用django自带的user做外键的方法
Nov 30 Python
用python-webdriver实现自动填表的示例代码
Jan 13 Python
Python编写nmap扫描工具
Jul 21 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
DIY实用性框形天线
2021/03/02 无线电
PHP的开发框架的现状和展望
2007/03/16 PHP
PHP CKEditor 上传图片实现代码
2009/11/06 PHP
php 判断数组是几维数组
2013/03/20 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
js下用gb2312编码解码实现方法
2009/12/31 Javascript
6款新颖的jQuery和CSS3进度条插件推荐
2013/03/05 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
JavaScript对HTML DOM使用EventListener进行操作
2015/10/21 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
js实现图片切换(动画版)
2016/12/25 Javascript
基于JavaScript实现无缝滚动效果
2017/07/21 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
python利用beautifulSoup实现爬虫
2014/09/29 Python
浅析Python中的join()方法的使用
2015/05/19 Python
python数组复制拷贝的实现方法
2015/06/09 Python
python 进程间数据共享multiProcess.Manger实现解析
2019/09/23 Python
python实现拼图小游戏
2020/02/22 Python
Python super()方法原理详解
2020/03/31 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
2021/01/07 Python
python中添加模块导入路径的方法
2021/02/03 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
什么情况下你必须要把一个类定义为abstract的
2013/01/06 面试题
J2EE面试题大全
2016/08/06 面试题
小学教师自我鉴定
2013/11/07 职场文书
战略合作意向书
2014/07/29 职场文书
普宁寺导游词
2015/02/04 职场文书
法定代表人免职证明
2015/06/24 职场文书
车辆挂靠协议书
2016/03/23 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript
美元符号 $
2022/02/17 杂记