美文网首页
2020-012 python闭包与装饰器

2020-012 python闭包与装饰器

作者: SSSimonYang | 来源:发表于2022-01-15 17:43 被阅读0次

    python闭包与装饰器

    闭包

    函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。

    常用语言基本都实现了闭包。

    闭包中最重要的是,我们返回了一个内部函数。

    def power(n):
        def func(m):
            return m**n
        return func
    

    power函数中,我们定义了一个func函数,func函数接收底数m,从外部power函数中拿到指数n,返回幂m**n

    这个简单的定义可以使我们获得能够进行任何指数操作的函数。

    power2 = power(2)
    power5 = power(5)
    power10 = power(10)
    print(power2(4))
    print(power5(4))
    print(power5(10))
    

    out:

    16
    1024
    100000
    

    闭包使我们能够通过函数创造各种各样的类似函数,是不是很神奇?

    今天我也写了一个闭包。它能够接收gtf文件返回某个染色体位置的基因。

    def get_gene(file="Homo_sapiens_GRCh37_87_geneonly.gtf"):
        gtf = pd.read_csv(file, header=None, sep='\t')
        gtf['gene_name'] = gtf[8].apply(lambda x: re.search(r'gene_name \"(.*?)\"', x).group(1))
    
        def fetch(chrom, start):
            start = int(start)
            value = gtf[(gtf[0] == chrom) & (gtf[3] <= start) & (gtf[4] >= start)]['gene_name'].tolist()
            if value:
                return value[0]
            else:
                return None
    
        return fetch
    

    创建具体的fetch

    fetch = get_gene()
    fetch(10,103454465)
    

    out:

    'FBXW4'
    

    这样就可以避免重复操作文件,变量值也不会暴露在环境中。

    装饰器

    装饰器的作用就是为已经存在的对象添加额外的功能。

    其实装饰器也是一个闭包,但是我们一般不用装饰器修改函数功能。

    def square(n):
        print(f'square {n}')
        return n**2
        
    square(2)
    

    out:

    square 2
    4
    

    写一个装饰器,能够在函数执行前打印执行时间。

    import time
    def decorator(func):
        def wrapper(*args,**kwargs):
            print(time.time())
            return func(*args,**kwargs)  
        return wrapper
        
    @decorator
    def square(n):
        print(f'square {n}')
        return n**2
    

    out:

    1597498618.3460186
    square 2
    4
    

    其实@decorator实现的就是square = decorator(square),这样就用返回的函数替换了原来的square,但是decorator会在打印时间后继续执行原函数,原函数在装饰器内部以外部函数变量存在(闭包,不是吗),这样就为函数添加了额外的功能。

    学会,点赞!

    相关文章

      网友评论

          本文标题:2020-012 python闭包与装饰器

          本文链接:https://www.haomeiwen.com/subject/enathrtx.html