装饰器

2021/4/24 18:25:36

本文主要是介绍装饰器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

装饰器

-定义:本质是函数,功能是为其他函数添加附加功能

-原则:

1,不修改被修饰函数的源代码

2,不修改被修饰函数的调用方式

 

装饰器=高阶函数 +函数嵌套 +闭包

 

高阶函数的定义:

-函数接收的参数是函数名

import time
def foo():
    time.sleep(0.1)
    print('你们好啊')

def test(func):
    start_time = time.time()
    func()
    end_time = time.time()
    print('运行时间是:%s'%(end_time-start_time))
test(foo)=======================》此函数接收大参数是函数名,但函数foo()的运行方式改变成了test(foo)
结果是:你们好啊
       运行时间是:0.10401010513305664

-函数的返回值也是函数名

import time
def foo():
    time.sleep(0.1)
    print('你们好啊')

def test(func):
    start_time = time.time()
    func()
    end_time = time.time()
    print('运行时间是:%s'%(end_time-start_time))
    return func

foo = test(foo)======>结果是 你们好啊
                            运行时间是:0.10253691673278809
foo()============>结果是:你们好啊

满足上述任意一个条件都是高阶函数

 

-函数嵌套

在函数中重新定义一个函数,如下:

def foo():
    print('你好')
    def test():
        print('alisa')
    test()
ps:函数也是一个变量

- 闭包类似于作用域

 

装饰器框架(如下):

def timmer(func):
    def wrapper():
        print(func)
        func()
    return wrapper

需要计算以下函数运行的时间,写代码(用装饰器):

import time

def timmer(func):
    def wrapper():
        start_time = time.time()
        func()
        end_time = time.time()
        print('程序运行时间是%s'%(end_time-start_time))
    return wrapper

def test():
    time.sleep(0.3)
    print('到此结束')

test = timmer(test)======》此处timmer(test)运行的结果是返回wrapper的地址
test()=======》此处相当于运行wrapper()

注意:上述倒数第二行代码中test = timmer(test)可以换成@timmer 进行简化

可以直接在需要装饰的函数前写上 @装饰器 直接对函数进行装饰

 

-需要装饰的函数添加返回值:

import time
def timmer(func):
    def wrapper():
        start_time = time.time()
        res = func()
        end_time = time.time()
        print('程序运行时间是%s'%(end_time-start_time))
        return res
    return wrapper

@timmer
def test():
    time.sleep(0.3)
    print('到此结束')
    return 'ni'
res =test()
print(res)

运行结果是:

到此结束
程序运行时间是0.3040931224822998
ni

- 需要装饰的函数加上多个参数

import time

def timmer(func):
    def wrapper(*args,**kwargs):  ======>注意:*args:上传的是以()元祖的形式,例如:(1,2,3,4)**kargs 上传的是字典的形式 如:(name = alisa)
        start_time = time.time()
        res = func(*args,**kwargs)
        end_time = time.time()
        print('程序运行时间是%s'%(end_time-start_time))
        return res
    return wrapper

@timmer
def test(age,name):
    time.sleep(0.3)
    print('到此结束','年龄是【%s】,名字是【%s】'%(age,name))
    return 'ni'
test(12,'lisa')

 

ps: 补充技巧 如下:

ni = [21,23,22,33,44,55,88,55]

求第一位元素
a,*_d =ni=====》a代表第一位元素,d代表最后一位元素 *代表中间元素,_代表不显示
print(a)======>第一位元素是 21

求第一位和最后一位元素
a,*_,d=ni
print(a,d)====》21,55
将a = 1 b = 2 变成 a = 2,b = 1 
a,b=2,1
print(a,b)====结果是2,1
    


 



这篇关于装饰器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程