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框架中使用通用视图的方法
Jul 21 Python
Python实现模拟登录及表单提交的方法
Jul 25 Python
VSCode下配置python调试运行环境的方法
Apr 06 Python
python实现读Excel写入.txt的方法
Apr 29 Python
Selenium元素的常用操作方法分析
Aug 10 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
一篇文章弄懂Python中所有数组数据类型
Jun 23 Python
python实现逆滤波与维纳滤波示例
Feb 26 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
Mar 25 Python
Python中logger日志模块详解
Aug 04 Python
Anaconda配置各版本Pytorch的实现
Aug 07 Python
Python Pandas解析读写 CSV 文件
Apr 11 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字符串处理的10个简单方法
2010/06/30 PHP
php 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
thinkphp连贯操作实例分析
2014/11/22 PHP
php parse_str() 函数的定义和用法
2016/05/23 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
很可爱的输入框
2008/08/03 Javascript
JavaScript类型转换方法及需要注意的问题小结(挺全面)
2010/11/11 Javascript
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
js简单实现图片延迟加载的方法
2016/07/19 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
详解vue配置后台接口方式
2019/03/29 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
Python3读取文件常用方法实例分析
2015/05/22 Python
Python基础知识_浅谈用户交互
2017/05/31 Python
python脚本替换指定行实现步骤
2017/07/11 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
python使用tkinter库实现五子棋游戏
2019/06/18 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
使用npy转image图像并保存的实例
2020/07/01 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
2020/10/19 Python
python-地图可视化组件folium的操作
2020/12/14 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
英国家电直销:Appliances Direct
2016/09/22 全球购物
中职应届生会计求职信
2013/10/23 职场文书
美德少年主要事迹材料
2015/11/04 职场文书
创业计划书之废品回收
2019/09/26 职场文书
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
2021/05/21 PostgreSQL