Python 标准库functools

Python标准库functools

functools模块提供了高阶函数功能:函数可以作为或者返回其他函数。通常, 任何可调用对象可以被视为在本模块的函数。

高阶函数是指将函数作为传参或返回值的函数,即functools提供了一些工具,用来处理函数。包含的方法主要有cmp_to_key, partial, reduce, total_ordering, update_wrapper, wraps。

cmp_to_key

cmp_to_key的作用就是讲cmp函数转化为key函数。这里有两个概念:

比较函数是任何一个可调用的函数,且包含两个参数,对参数进行比较,如果小于返回负数,等于返回0,大于返回正数。
关键函数是一种可调用函数。接受一个参数,返回另一个表明其在期望序列中的位置的值。

cmp_to_key应用在需要key函数作为参数的函数中,比如sorted, min, max等。我们用sorted函数举例:

from functools import cmp_to_key
s1 = sorted(range(5)) # [0, 1, 2, 3, 4]
s2 = sorted(range(5), cmp=lambda x, y: x % 3 - y % 3)
s3 = sorted(range(5), key=lambda x: x % 3
s4 = sorted(range(5), key=cmp_to_key(lambda x, y: x % 3 - y % 3))

上面的例子中,s1是默认排序;s2,s3,s4是等效的,将0-4按照模3进行比较。s2指定了cmp函数,s3指定了key函数,s4将s2的cmp函数转换为key函数。

partial

partial是偏函数应用,将函数的部分参数固定到新的函数中。一般实现:

def add(x, y):
    return x + y

def add2(y):
    return add(2, y)

add2(3) # 5

上面的例子是将add函数的一个参数x=2固定到add2中。这个例子可以通过partial实现:

def add(x, y):
    return x + y

add2 = functools.partial(add, 2)

add2(3) # 5

reduce

就是python2 内建函数reduce。在python3中reduce被移除内建函数,用functools.reduce可以向前兼容。

total_ordering

total_ordering 同样是 Python 2.7 中新增函数,用于简化比较函数的写法。如果你已经定义了 __eq__ 方法,以及 __lt__、__le__、__gt__ 或者 __ge__ 其中之一, 即可自动生成其它比较方法。官方示例:

@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()))
dir(Student) # ['__doc__', '__eq__', '__ge__', '__gt__', '__le__', '__lt__', '__module__']

warps

之前了解过装饰器函数,装饰器会有一个副作用,会把原函数的名字覆盖掉。

def outer(fun):
    def inner():
        pass
    return inner

@outer
def fun():
    pass

f = fun
f.__name__ # inner

wraps用来解决这个问题。

def outer(fun):
    @wraps
    def inner():
        pass
    return inner

@outer
def fun():
    pass

f = fun
f.__name__ # fun

除了__name__外,wraps还能修改的属性可以通过functools.WRAPPER_ASSIGNMENTS查询。

('__module__', '__name__', '__doc__')

update_wrapper

update_wrapper功能与wraps类似,后者可以看做前者的特化,可以理解为

wraps = partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)

参考

http://python.usyiyi.cn/python_278/library/index.html

你可能感兴趣的:(Python,python,functools)