懒死了,懒死了,有好久没有更新,就将之前总结的文档放到blog上面充数了,不能这样呀!
好了,开始第二篇
functools模块用于高阶函数:作用于或返回其他函数的函数。
functools模块有以下函数
- cmp_to_key
- partial
- reduce
- wraps
- total_ordering
- update_wrapper
cmp_to_key
将旧风格的比较函数转换为key函数。
partial
回一个新的partial对象,该对象在调用时将采用位置参数args和关键字参数关键字调用的func 。如果提供多个参数调用, 它们会被追加给 args。如果提供额外的关键字参数, 它们会扩展和覆盖 keywords。
In [10]: def add(x, y, z):
...: return x+y+z
...:
In [11]: sum = partial(add, 3, 4)
In [12]: sum(10)
Out[12]: 17
In [13]: sum = partial(add,)
In [14]: sum(10, 3, 4)
Out[14]: 17
In [15]:
reduce
将两个参数的函数累加到序列的项中,从左到右,以便将序列减少为单个值。For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5). 左参数,x是累加值,右参数,y是来自序列的更新值。如果存在可选的初始化器,则它将放置在计算中序列的项目之前,并在序列为空时用作默认值。如果未提供初始化程序且序列只包含一个项目,则返回第一个项目。
In [17]: def add(x, y):
...: return x+y
...:
In [18]: list = [1, 2, 3, 4, 5]
In [19]: reduce(add, list)
Out[19]: 15
题外话,Python内部还有一个map函数,作用刚好的reduce类似,经常用来做大数据处理
用法如下:
In [22]: def square(x) :
...: return x**2
...:
In [23]: map(square, list)
Out[23]: [1, 4, 9, 16, 25]
In [26]: s1 = [1, 3, 5, 7, 9]
In [27]: s2 = [2, 4, 6, 8, 10]
In [28]: map(add, s1, s2)
Out[28]: [3, 7, 11, 15, 19]
wraps
这是一个方便的函数,用于在定义包装器函数时调用update_wrapper()作为函数装饰器
可以避免由于本身装饰器漏洞导致函数名和文档混乱,建议使用装饰器,使用wraps
In [37]: def wrapper(func):
...: @wraps(func)
...: def wrapper_function(*args, **kwargs):
...: """this is a decorator function"""
...: return func(*args, **kwargs)
...: return wrapper_function
In [38]: @wrapper
...: def wrapped():
...: """This is a decorated function"""
...: print 'wrapped'
In [59]: wrapped.__name__
Out[59]: 'wrapped'
In [60]: wrapped.__doc__
Out[60]: 'This is a decorated function'
对比 原生装饰器如下
In [53]: def decorator(func):
...: def wrapper(*args, **kwargs):
...: """this is a decorator function"""
...: return func(*args, **kwargs)
...: return wrapper
...:
In [54]: @decorator
...: def wrapped():
...: """This is a decorated function"""
...: print 'wrapped'
In [55]: wrapped.__name__
Out[55]: 'wrapper'
In [56]: wrapped.__doc__
Out[56]: 'this is a decorator function'
total_ordering
给定一个定义了一个或多个富比较排序方法的类,该方法提供了一个类装饰器。这简化了指定所有可能的富比较操作的工作量。
类必须定义__lt__(),le(),gt()或__ge__()此外,该类应提供一个__eq__()方法。
虽然这个装饰器使得容易创建行为良好的完全有序类型,但是以导致比较方法的较慢执行和更复杂的堆栈跟踪为代价的。如果性能基准测试表明这是给定应用程序的瓶颈,则实施所有六种丰富的比较方法可能提供一个容易的速度提升。
In [4]: @total_ordering
...: class Student:
...: def _is_valid_operand(self, other):
...: return (hasattr(other, "lastname") and
...: hasattr(other, "firstname"))
...: def __eq__(self, other):
...: if not self._is_valid_operand(other):
...: return NotImplemented
...: return ((self.lastname.lower(), self.firstname.lower()) ==
...: (other.lastname.lower(), other.firstname.lower()))
...: def __lt__(self, other):
...: if not self._is_valid_operand(other):
...: return NotImplemented
...: return ((self.lastname.lower(), self.firstname.lower()) <
...: (other.lastname.lower(), other.firstname.lower()))
...:
update_wrapper
更新一个 wrapper 函数让其更像一个 wrapped 函数。
此函数的主要用途是在decorator函数中,它包装修饰的函数并返回包装器。如果不更新包装器函数,返回的函数的元数据将反射包装器的定义,而不是原函数的定义 ,这通常是没有意义的。
update_wrapper()可以与除函数之外的可调用项一起使用。