python 闭包 ,装饰器

版权声明: https://blog.csdn.net/djs123DJS/article/details/84972368
#_author:'DJS'
#date:2018-12-12
import time
##闭包就是两个函数组成,里面的函数用到外面函数的变量值再加上里面函数的值,那一个坨空间,就是闭包。
##能当做实参进行传递,并且能传递功能和数据。
def line_6(k,b):
    x = 200
    def create_y(x):
        nonlocal x #修改闭包外面的值,用nonlocal.
        print(k*x+b)
    return create_y #返回一个函数名,即是函数的引用,line_6函数的返回值就是一个函数的引用
#返回值是一个函数的引用,说明它还可以调用一个函数。闭包就是里面嵌套的函数,可以用外面函数的
#变量,就是一个函数干了两个函数的事情。把我一个函数名作为实参传递,得到的是这个函数引用
#即是函数的代码并没有数据,但是闭包可以实现传递一个函数名,还能传递这个函数的数据。
#函数和闭包的区别:函数就是一坨代码,他不会把数据传递过去,但是闭包拥有函数的功能还能传递数据。
#函数,匿名函数,闭包,对象,当做实参时,的区别。
#1.匿名函数能够完成基本的简单功能,传递是这个函数的引用,只有功能
#2.普通函数能够完成较为复杂的功能,传递是这个函数的引用,只有功能
#3.闭包能够完成较为复杂的功能,传递是这个闭包中的函数以及数据,因此传递是功能加数据
#4.对象能够完成最为复杂的功能,传递是很多数据+很多功能,因此传递是功能+数据
line_6_1 = line_6(1,2) #这里相当于创建了一个闭包
line_6_1(0)
line_6_1(1)
line_6_1(2)
line_6_2 = line_6(11,22)
line_6_2(0)
line_6_2(1)
line_6_2(2)

###装饰器
def set_func(func):#set_func()函数的主要作用是传递变量,即传递数据。还有下面的返回值
#执行set_func()函数得到的是一个返回值,这个返回值里面还携带着一个变量(函数引用)。
    def call_func(*args,**kwargs):#接收的时候用不固定长参数来接收#被装饰的函数有参数,这里也要有参数 #执行set_func函数的时候,这个函数不会执行,他是一个函数,并没有调用他
#执行test1()的时候才调用这个函数,然后再调用下面那个func(),func()就是下面那个test1
#函数,func变量是指向test1的。把一个函数名当做实参传递,也要调用这个函数,这个函数才能执行
        star_time = time.time()
        # print("---这是权限验证1--")
        # print("--这是权限验证2--")
        func(*args,**kwargs)#传递的时候就用不固定长的参数来传递 #被装饰的函数有参数,这里也要有参数
        stop_time = time.time()
        return func(*args,**kwargs) #加return和不固定长参数就是通用装饰器了
        print("运行的时间戳%f" %(stop_time-star_time))
    return call_func
#@set_func #先执行装饰器的代码,再执行下面函数的代码
#在函数上面添加@set_func等价于test1 = set_func(test1)这句话
#装饰器是在函数执行之前执行。
@set_func #装饰器在没有调用函数之前已经装饰好了
def test1(num):
    for i in range(100000):
        pass

#test1 = set_func(test1) #这里把text1的函数当做实参,改变test1的指向,让它指向set_func函数的
#返回值
#装饰器装一个函数线当于创建了一个闭包,闭包外函数的变量指向被装饰的函数。装饰器在没有调用函数之前已经装饰器
test1(100)

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/djs123DJS/article/details/84972368