zoukankan      html  css  js  c++  java
  • functools模块

    functools模块

    functools模块包含能够创建高阶函数,函数式编程和装饰器的函数和装饰器

    partial

    partial(function [,*args [,**kwargs]])	
    

    创建一个类似函数的对象partial,当调用该对象时,会使用参数来调用函数function

    例:

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    import functools
    def add(m,n):
        print(m+n)
    
    if __name__=="__main__":
        f = functools.partial(add,m=3)
        for i in range(5):
            f(n=i)
    

    结果:

    3
    4
    5
    6
    7
    

    在使用partial对象提到常规函数时,得到的结果与使用常规函数的结果不不完全一致。例如,在类定义中使用partial(),那么该函数的行为类似于静态方法,而不是实例方法

    reduce

    reduce(function, items [, inital])
    

    向可迭代的items中的项渐增地应用函数function,并返回一个值。

    例:

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    import functools
    def add(m,n):
        return m+n
    
    if __name__=="__main__":
        f = functools.reduce(add, [1,2,3,4],5)
        print(f)
    

    结果:

    15
    

    update_wrapper

    update_wrapper(wrapper, wrapped [, assigned [, updated]])
    

    这是一个使用工具函数,在编写装饰器的时很有用,将函数wrapped的属性赋值到包装饰器函数wrapper,使包装的函数类似于原始函数。assigned是要复制的属性元组,默认设置为(‘__name__’,'__module__','__doc__')。

    updated是一个元组,包含一些函数属性名称,这些函数属性时字典并且需要将它们的值合并到包装器中,默认情况下是('__dict__')

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    def wrap(func):
        def call_it(*args,**kwargs):
            """wrap func: call_it"""
            print('before call')
            return func(*args,**kwargs)
        return call_it
     
    @wrap
    def hello():
        """say hello"""
        print("hello world")
     
    from functools import update_wrapper
    def wrap2(func):
        def call_it(*args, **kwargs):
            """wrap func: call_it2"""
            print('before call')
            return func(*args, **kwargs)
        return update_wrapper(call_it, func)
     
    @wrap2
    def hello2():
        """test hello"""
        print('hello world2')
     
    if __name__ == '__main__':
        hello()
        print(hello.__name__)
        print(hello.__doc__)
     
        print()
        hello2()
        print(hello2.__name__)
        print(hello2.__doc__)
    

    结果:

    before call
    hello world
    call_it
    wrap func: call_it
    
    before call
    hello world2
    hello2
    test hello
    

    wraps

    wraps(function [, assigned [, updated]])
    

    一个装饰器,在它所应用的函数上执行于update.wrapper()相同的任务

    例:未使用wraps装饰器

    def aaa(func):
        def bbb(*args, **kwargs):
            print("****************************")
            func(*args, **kwargs)
            print("****************************")
        return bbb
    
    @aaa
    def ccc():
        print("aaaaaaaaaaaaaaaaaaaaaaaaaaa")
    
    if __name__ == '__main__':
        ccc()
        print(ccc.__name__)
    

    结果:

    ****************************
    aaaaaaaaaaaaaaaaaaaaaaaaaaa
    ****************************
    bbb   # 函数ccc的__name__打印为bbb
    

    使用wraps装饰器

    from functools import wraps
    def aaa(func):
        @wraps(func)
        def bbb(*args, **kwargs):
            print("****************************")
            func(*args, **kwargs)
            print("****************************")
        return bbb
    
    @aaa
    def ccc():
        print("aaaaaaaaaaaaaaaaaaaaaaaaaaa")
    
    if __name__ == '__main__':
        ccc()
        print(ccc.__name__)
    

    结果:

    ****************************
    aaaaaaaaaaaaaaaaaaaaaaaaaaa
    ****************************
    ccc   #函数ccc的__name__打印为ccc
    
  • 相关阅读:
    Android-adb相关
    我想和iOS大牛们交流的问题
    iOS应用 bug定位
    iOS 中Block的基础用法
    iOS9 耗电量惊人
    三人小团队git分支协作试水
    今天开通了博客
    解决XCode安装插件后插件不能使用的问题(转载)
    (转载)iOS- 指压即达,如何集成iOS9里的3D Touch
    人魔七七
  • 原文地址:https://www.cnblogs.com/jingxindeyi/p/14737406.html
Copyright © 2011-2022 走看看