Python装饰器,闭包(Pyday16)

 

 1.闭包:

1 def outer():
2     x=10
3     def inner():#inner()局部变量,全局无法调用,条件1.inner是内部函数
4         print(x)#条件2.调用外部变量x
5     return inner
6 outer()()#结果是10

 

 2.装饰器:

 

# 首先说一下装饰器的用处,其实就是给一个函数添加额外的功能,而且的话不影响函数调用方式,对这个装饰器就是这么的强。
# 这个以后一定要多多的使用,可以节省很多的代码,以及性能的优化,以前一直没有注意,这么好的用法,很气呀!

# 下面就开始代码的回顾。

 

 》1.第一种方法

 

def show_time(func):
    print('执行show_time函数')

    def pull():
        start_time = time.time()
        func()             # 这个地方就是一个闭包,里面的函数可以调用外层函数的参数,这就是闭包!
        end_time = time.time()
        print('take time is %s' % (end_time-start_time))     # take time is 3.000788927078247

    return pull

 

 

 

》 2.而现在有个拓展的业务,加上一个time.sleep(3)停留3秒钟的功能,但是又不能改人家前端的调用foo()函数的方式

所以就有了这个装饰器的用法,简直就是一个福利,下面使用闭包做的

def show_time(func):
    print('执行show_time函数')

    def pull():
        start_time = time.time()
        func()             # 这个地方就是一个闭包,里面的函数可以调用外层函数的参数,这就是闭包!
        end_time = time.time()
        print('take time is %s' % (end_time-start_time))     # take time is 3.000788927078247

    return pull


def foo():

    print('这是我添加的一个装饰器')
    time.sleep(3)
    
    
foo = show_time(foo)
foo()

 

 

》 3.另一种高大上的做法(和上面是一样的只是用了一个Python(@)内置的函数)就是用到了装饰器的方法!    ***重点!

  

def show_time(func):
    print('执行show_time函数')

    def pull():
        start_time = time.time()
        func()             # 这个地方就是一个闭包,里面的函数可以调用外层函数的参数,这就是闭包!
        end_time = time.time()
        print('take time is %s' % (end_time-start_time))     # take time is 3.000788927078247

    return pull


# 下面就是比较牛逼的装饰器代码了!
@show_time   # @show_time相当于foo  = show_time(foo)
def foo():
    print('这是我添加的一个装饰器')
    time.sleep(3)


foo()
# 这上面的代码的意思和上面的作用是一样的,这就是传说中的装饰器,

 

 3.功能函数加参数:

 1 def show_time(f):#f是外部作用变量
 2     def inner(*a,**b):#内部函数
 3         start=time.time()
 4         f(*a,**b)
 5         end=time.time()
 6         print('time is %s' % (end - start))  # 结果是time is 2.000277519226074
 7     return inner
 8 @show_time   #就相当于foo=show_time(foo)
 9 def foo(x,y):
10     print(x+y)
11     time.sleep(2)
12     print('计算差值是')
13 foo(2,3)#5计算差值是time is 2.000110387802124

 》1.升级一下

1 @show_time
2 def foo(*args,**kwargs):#可以随意的加变量没有限制
3     sum=0
4     for i in args:
5         sum+=i
6     print(sum)
7 foo(1,2,3,4,44,6)

  其中*args代表着任意的字符,且数目任意,*kwargs是通过键值对的形式输出数据,

 

 

 4.装饰器函数加参数:

 

 1 def logger(flag):
 2     def show_time(f):#f是外部作用变量
 3         def inner(*a,**b):#内部函数
 4             start=time.time()
 5             f(*a,**b)
 6             end=time.time()
 7             print('time is %s' % (end - start))  # 结果是time is 2.000277519226074
 8             if flag=='true':
 9                 print('实现在装饰器里加参数了')
10         return inner
11     return logger
12 @logger('true')#就相当于#show_time其实就是加一个变量,所以才套了一个函数
13 def foo(*args,**kwargs):#可以随意的加变量没有限制
14     sum=0
15     for i in args:
16         sum+=i
17     print(sum)
18 foo(1)

 

posted @ 2018-01-28 14:33  西园公子zwj  阅读(115)  评论(0)    收藏  举报