python进阶:装饰器

 1.闭包

  简单理解:闭包就是多层函数的嵌套,外层函数的返回值是内层函数的引用。

def out_func(n):
    num = 100
    def in_fucn(*args,**kwargs):
     # nonlocal num
if n % 2 == 0: # 里面没有修改num的值,直接使用可以,如果变成 num += n 则会报错,因此需要使用前加上nonlocal num return n + num
       # return num += n
else: return n- num return in_fucn test = out_func(10) ret = test() print(ret) # 结果 110

 

 

  闭包的作用就是,装饰器

 2.装饰器

  简单的理解:就是不改变函数结构的情况下,给函数增加功能

def outter(func):

    def inner(*args,**kwargs):
        print("今天星期五")
        func(*args,**kwargs)
        print("下午我和,小红去吃烤鱼")
    return inner


def test(*args,**kwargs):
    print("今天天气很不错")

test = outter(test) # 标准写法
test() # 普通的调用了test函数,但是给函数上下都多打印了一行数字。

# 结果
今天星期五
今天天气很不错
下午我和,小红去吃烤鱼

 

   装饰器实现检测函数运行时间的功能

import time
def outter(func):

    def inner(*args,**kwargs):
        start_t = time.time()
        func(*args,**kwargs)
        end_t = time.time()
        print("函数test的运行时间为{}s".format(end_t-start_t))
    return inner


def test(*args,**kwargs):
    time.sleep(10)
    
test = outter(test)
test()

# 结果
函数test的运行时间为10.098577499389648s

 

 优雅的写法

import time
def outter(func):

    def inner(*args,**kwargs):
        start_t = time.time()
        func(*args,**kwargs)
        end_t = time.time()
        print("函数test的运行时间为{}s".format(end_t-start_t))
    return inner

@outter
def test(*args,**kwargs):
    time.sleep(10)

test()

# 结果
函数test的运行时间为10.000571966171265s

 

posted @ 2019-10-16 21:14  张京墨  阅读(142)  评论(0编辑  收藏  举报