python中functools_Python之functools库

functools库用于高阶函数,指那些作用于函数或者返回其他函数的函数

functools提供方法如下:

cmp_to_key

将一个比较函数转换关键字函数

partial

针对函数起作用,并且是部分的

reduce

与python内置的reduce函数功能一样

total_ordering

在类装饰器中按照缺失顺序填充方法

update_wrapper

更新一个包裹函数,使其看起来更像被包裹的函数

wraps

可用作一个装饰器,简化调用update_wrapper过程

cmp_to_key

将老式的比较函数转换为关键字函数,与接收key function的函数一起使用,比如sorted(iterator[,key,[,reverse]])

注:Python3.0中不支持比较函数

deffun(a, b):return a[1] - b[1] #不明白这个位置为什么不能用>

from functools importcmp_to_key

l11=[('b',2),('a',1),('c',3),('d',4)]

l2= sorted(l11, key=cmp_to_key(fun))print(l2)from operator importitemgetter

l3= sorted(l11, key=itemgetter(1))print(l3)>>> [('a', 1), ('b', 2), ('c', 3), ('d', 4)]>>> [('a', 1), ('b', 2), ('c', 3), ('d', 4)]

partial

functools.partial(func,*args, **dwds),函数装饰器,返回一个新的partial对象

作用:当一个函数func可以接收很多参数,而某一次使用只需要更改其中的一部分参数,其他的参数都保持不变时,partial对象就可以将这些不变的对象冻结起来,这样调用partial对象时传入未冻结的参数,partial对象调用func时连同已经被冻结的参数一同传给func函数,从而可以简化调用过程。

#coding = utf-8

from functools importpartialdeffun(arg1, arg2,arg3,arg4):return arg1+arg2+arg3+arg4#比如参数arg1, arg2,arg3一直保持不变,可以使用#partial对象将这些不变的参数冻结起来

nochangeparm = partial(fun,1,2,3)print (nochangeparm(4))>>> 10

total_ordering

这是一个类装饰器,给定一个类,这个类定义了一个或者多个比较排序方法,这个类装饰器将会补充其他的比较方法,减少了自己定义所有方法时的工作量

被修饰的类必须提供__eq__()方法和__lt__(), __le__(),__gt__(),__ge__()中的至少一个

#coding = utf-8

from functools importtotal_ordering

@total_orderingclasstest:def __init__(self,num):

self.num=numdef __eq__(self,object):return (self.num ==object.num)def __lt__(self,object):return (self.num

未使用@total_ordering输出:

使用@total_ordering输出:

update_wrapper

更新一个包裹(wrapper)函数,使其看起来更像被包裹(wrapped)的函数。

可选的参数指定了被包裹函数的哪些属性直接赋值给包裹函数的对应属性,同时包裹函数的哪些属性要更新而不是直接接受被包裹函数的对应属性,参数assigned的默认值对应于模块级常量WRAPPER_ASSIGNMENTS(默认地将被包裹函数的 __name__, __module__,和 __doc__ 属性赋值给包裹函数),参数updated的默认值对应于模块级常量WRAPPER_UPDATES(默认更新wrapper函数的 __dict__ 属性)。

这个函数的主要用途是在一个装饰器中,原函数会被装饰(包裹),装饰器函数会返回一个wrapper函数,如果装饰器返回的这个wrapper函数没有被更新,那么它的一些元数据更多的是反映wrapper函数定义的特征,无法反映wrapped函数的特性。

wraps

这个函数可用作一个装饰器,简化调用update_wrapper的过程,调用这个函数等价于调用partial(update_wrapper, wrapped = wrapped, assigned = assigned,updated = updated)。

#coding = utf-8

from functools importwrapsdefmy_decorator(f):#@wraps(f)

def wrapper(*args,**kwds):print ("Calling decorated function")return f(*args,**kwds)returnwrapper

@my_decoratordefexample():"""DocString"""

print ("Called example function")

example()print (example.__name__)print (example.__doc__)

未使用@wraps前输出:

使用@wraps后输出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值