闭包
   
    定义:如果在一个内部函数里,对再外部作用域的变量进行引用,那么
    
     内部函数
    
    就被认为是一个
    
     闭包
    
   
条件:1.是一个内部函数 2.函数内有外部环境的一个变量
效果:脱离环境在外部调用变量
def outer():
    x=10
    def inner():
        print(x)
    return inner
f=outer()
f()输出结果为10
    装饰器
   
我们设想一个场景,你已经写好了一个函数
def f():
    print('this is a function')
f()但是你的boss让你再增加一个能输出每个函数运算所花时间的功能
你该怎么办呢?
很显然以下方法很简单
import time
def f():
    start=time.time()
    print('this is a function')
    end=time.time()
    print(end-start)
f()
但如果你要修改许多许多函数,一个一个改肯定不现实
所以我们就想到了用函数修改函数
import time
def f():
    print('this is a function')
def modify(f):
    start=time.time()
    f()
    end=time.time()
    print(end-start)
modify(f)
然而问题又来了,好端端的函数f又变成需要modify(f)才能执行,为什么不能把更改过后的函数直接赋给原来的函数呢?
import time
def f():
    print('this is a function')
def modify(f):
    start=time.time()
    f()
    end=time.time()
    print(end-start)
f=modify(f)
问题又双叒叕来了,你确定最后的f是一个函数吗?
    
     我们之前说过了闭包的特性,在此我们可以用闭包来解决这个问题
    
   
import time
def f():
    print('this is a function')
def modify(f):
    def inner():
        start=time.time()
        f()
        end=time.time()
        print(end-start)
    return inner
f=modify(f)这样f被修改成一个保有原来功能,并添加了能输出每个函数运算所花时间的功能的函数
    
     这个modify函数便是一个装饰器
    
   
也可以这么表达
import time
def modify(f):
    def inner():
        start=time.time()
        f()
        end=time.time()
        print(end-start)
    return inner
@modify
def f():
    print('this is a function')
@modify就是把modify函数作为装饰器修改f函数,其意义和在最后 f=modify(f) 是一样的
可以给功能函数加参数
import time
def modify(f):
    def inner(*a):
        start=time.time()
        f()
        end=time.time()
        print(end-start)
    return inner
@modify
def f(*a):
    sum=0
    for i in a:
        sum+=i
    print(i)
也可以给装饰器加参数
import time
def one(judge):
    def modify(f):
        def inner(*a):
            start=time.time()
            f()
            end=time.time()
            if judge==True
                print(end-start)
        return inner
    return modify
@one(True)
def f(*a):
    sum=0
    for i in a:
        sum+=i
    print(i)
对于想显示运行时间,可以@one(True),不想显示可以@one(False),增加了装饰器的可用性
 
版权声明:本文为Dovhkin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
