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中实现字符串类型与字典类型相互转换的方法
Aug 18 Python
python操作字典类型的常用方法(推荐)
May 16 Python
JPype实现在python中调用JAVA的实例
Jul 19 Python
pandas apply 函数 实现多进程的示例讲解
Apr 20 Python
python tornado使用流生成图片的例子
Nov 18 Python
python循环输出三角形图案的例子
Nov 22 Python
django序列化serializers过程解析
Dec 14 Python
pytorch 图像预处理之减去均值,除以方差的实例
Jan 02 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 Python
使用python批量转换文件编码为UTF-8的实现
Apr 03 Python
flask框架中的cookie和session使用
Jan 31 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 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&amp;&amp;mysql)四
2006/10/09 PHP
PHP判断图片格式的七种方法小结
2013/06/03 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
jQuery延迟执行的实现方法
2016/12/21 Javascript
jquery 正整数数字校验正则表达式
2017/01/10 Javascript
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python 获取文件列表(或是目录例表)
2009/03/25 Python
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
Python中的单继承与多继承实例分析
2018/05/10 Python
selenium+python实现1688网站验证码图片的截取功能
2018/08/14 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
python 删除系统中的文件(按时间,大小,扩展名)
2020/11/19 Python
python 实现性别识别
2020/11/21 Python
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
html5的canvas方法使用指南
2014/12/15 HTML / CSS
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
英国领先的名牌服装折扣零售商:Brown Bag Clothing
2019/01/08 全球购物
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
化学教师自荐信范文
2013/12/28 职场文书
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
物理教学随笔感言
2014/02/22 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
pytest配置文件pytest.ini的详细使用
2021/04/17 Python
Java SSM配置文件案例详解
2021/08/30 Java/Android
Python编程编写完善的命令行工具
2021/09/15 Python
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL
SQL Server使用T-SQL语句批处理
2022/05/20 SQL Server