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中使用M2Crypto模块实现AES加密的教程
Apr 08 Python
python去除空格和换行符的实现方法(推荐)
Jan 04 Python
TensorFlow模型保存/载入的两种方法
Mar 08 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
Aug 18 Python
Python socket非阻塞模块应用示例
Sep 12 Python
将python安装信息加入注册表的示例
Nov 20 Python
python使用pip安装SciPy、SymPy、matplotlib教程
Nov 20 Python
Python itertools.product方法代码实例
Mar 27 Python
Tensorflow tf.tile()的用法实例分析
May 22 Python
什么是Python包的循环导入
Sep 08 Python
Python模拟登录和登录跳转的参考示例
Oct 30 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 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
使用Apache的rewrite技术
2006/06/22 PHP
PHP初学者头疼问题总结
2006/07/08 PHP
php中通过curl模拟登陆discuz论坛的实现代码
2012/02/16 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
PHP中使用curl伪造IP的简单方法
2015/08/07 PHP
Yii+upload实现AJAX上传图片的方法
2016/07/13 PHP
PHP PDOStatement::setAttribute讲解
2019/02/01 PHP
jQuery 注意事项 与原因分析
2009/04/24 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
jQuery打印图片pdf、txt示例代码
2014/07/22 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
js数组去重的方法总结
2019/01/18 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
Python标准异常和异常处理详解
2015/02/02 Python
提升Python程序运行效率的6个方法
2015/03/31 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
Python学习之Anaconda的使用与配置方法
2018/01/04 Python
python装饰器深入学习
2018/04/06 Python
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
Python常见内置高效率函数用法示例
2018/07/31 Python
flask session组件的使用示例
2018/12/25 Python
Python3使用Matplotlib 绘制精美的数学函数图形
2019/04/11 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
美国网上购买眼镜:Eyeconic
2017/07/29 全球购物
什么是servlet链?
2014/07/13 面试题
世博会口号
2014/06/20 职场文书
高三霸气励志标语
2014/06/24 职场文书
装修施工安全责任书
2014/07/24 职场文书
2014年最新个人对照检查材料范文
2014/09/25 职场文书
Python机器学习之底层实现KNN
2021/06/20 Python
win10识别不了U盘怎么办 win10系统读取U盘失败的解决办法
2022/08/05 数码科技