3.30闭包函数、装饰器

闭包函数、装饰器

函数名

    • 函数名的本质就是函数的内存地址。本质上是一个变量,特殊的变量。
    • 函数名+ ()   :执行函数
    • print(函数名):输出函数名在内存空间中的地址

 

      • 函数名用法
          1. 可以被引用、赋值
          2. 函数名可以用作容器型数据元素;
          3. 函数名可以用作参数;
          4. 函数名可以作为返回值。

闭包函数

    • 内部函数对外部作用域而非全局作用域变量的引用。该内部函数称为闭包函数。
        • 判断方式:函数名.__colsure__. cell就是闭包。
        • 闭包函数运行机制:当函数开始执行时,如果遇到闭包,它有一个机制,他会永远开闭一个内存空间,将闭包中的变量等值放入其中,不会随着函数的执行完毕而消失。   

        

 1 name = "qiji"
 2 
 3 def wraaper2(n):
 4     
 5     def inner():
 6         print(n)       ### 虽然没有inner没有直接调用外部作用域的函数,但是在赋值 n= name 的时候,相当于在函数定义的下一行运行了一栏“n= name”。
 7     inner()             ###所以inner也算引用了外部作用域的name,所以是闭包函数。
 8     print(inner.__closure__)
19 wraaper2(name)

 装饰器

    • 什么是装饰器:装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

    • 装饰器作用
        1. 没有改变原有函数的调用方式;
        2. 增添了额外功能而不改变原有函数
    • 语法糖 
        • @ 加 装饰器名称
        • 装饰器在前,语法糖在后。

           

 

 

    • 带有参数的装饰器            

 

 1 def timmer(f):
 2     def inner(*args,**kwargs):  ##闭包函数                   ###装饰器中传参时,闭包函数以及闭包函数的被测函数需要传参。以及最后的被测函数有对应参数。
 3         start_time = time.time()
 4         ret = f(*args,**kwargs)   ##被测函数
 5         time.sleep(0.3)
 6         end_time = time.time()
 7         print('此函数的执行效率%s' % (end_time - start_time))
 8         return ret
 9     return inner
10 
11 @timmer
12 
13 def func1(a,b):
14     print(a,b)
15     print('你有病呀,领导,测试我的执行效率干甚。')
16     return 666
17 
18 print('************',func1(1,2))

 

    • 写装饰器
        1. 写装饰器名称,写闭包函数inner,写被装饰函数, return闭包函数。

2.写装饰器参数,闭包函数、被装饰函数传参。

 

          3.添加被装饰函数之前之后的情况,返回被装饰函数

          4.填写语法糖,写在装饰器之后。写被测(被装饰)函数。

     

 

posted on 2018-03-30 15:56  弃疾  阅读(130)  评论(0)    收藏  举报

导航