python进阶:装饰器

瘦欲@ 提交于 2019-12-01 13:31:15

 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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!