• 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中不支持比较函数

    def fun(a, b):
        return a[1] - b[1] #不明白这个位置为什么不能用>
    
    from functools import cmp_to_key
    l11=[('b',2),('a',1),('c',3),('d',4)]
    l2 = sorted(l11, key=cmp_to_key(fun))
    print (l2)
    
    from operator import itemgetter
    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 import partial
    def fun(arg1, arg2,arg3,arg4):
        return arg1+arg2+arg3+arg4
    
    #比如参数arg1, arg2,arg3一直保持不变,可以使用
    #partial对象将这些不变的参数冻结起来
    nochangeparm = partial(fun,1,2,3)
    print (nochangeparm(4))
    
    >>> 10

      关于偏函数的更多详细知识可以参考:http://blog.csdn.net/appleyk/article/details/77609114

    total_ordering

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

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

    #coding = utf-8
    
    from functools import total_ordering
    
    @total_ordering
    class test:
        def __init__(self,num):
            self.num = num
            
        def __eq__(self,object):
            return (self.num == object.num)
    
        def __lt__(self,object):
            return (self.num < object.num)
    
    print (test.__dict__)      

    未使用@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 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()
    print (example.__name__)
    print (example.__doc__)

    未使用@wraps前输出:

    使用@wraps后输出

  • 相关阅读:
    python制作一个塔防射箭游戏
    有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同 学号的那些结点。
    python实现一个简单的21点游戏
    C语音,函数padd的功能是调整pa指向的链表中结点的位置,使得所有x值为偶数的结点出现在链表的前半部,所有x值为奇数的结点出现在链表的后半部。
    scratch绘制特殊图形1
    验证哥德巴赫猜想,输出6-100之间的偶数等于两个质数之和
    写一函数check检测字符串中的左右括号数是否匹配
    C语言文件操作题,将整数1-10及其算术平方根存入文件,再读取出来显示在屏幕上
    湖南2020对口计算机32题第1、2、3小题
    基础
  • 原文地址:https://www.cnblogs.com/xiaobingqianrui/p/8606410.html
Copyright © 2020-2023  润新知