Python基础——装饰器

什么是装饰器?

    装饰器本身就是函数,功能就是为其他函数添加新功能

装饰器的两大原则

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

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

装饰器所用到的知识点

    1:高阶函数

    2:函数的嵌套

    3:函数的闭包

一:高阶函数

    高阶函数就是满足这两个其中一个条件就称为高阶函数(1:函数接收的参数为函数名2:函数的返回值是一个函数名),如下

#满足于函数的参数为函数名
>>> def test():
	    print("这是一个常规函数")

	    
>>> def test1(func):
	    print("这是一个高阶函数")
	    func()

>>> test1(test)
这是一个高阶函数
这是一个常规函数
注:我们知道函数即变量,我们传入一个test函数的内存地址,运行func函数就相当于运行test函数
#满足于函数的返回值为函数名
>>> def test():
        print("这是一个常规函数")

>>> def test1(func):
        print("这是一个高阶函数")
        return func

>>> a=test1(test)
这是一个高阶函数
>>> a()
这是一个常规函数
注:这里返回的func就是test函数的内存地址

二:嵌套函数

>>> def sum():
	a=1
	def sum1():
		nonlocal a
		a+=3
	sum1()
	return a

>>> print(sum())
4

三:函数闭包

    函数的闭包其实可以理解为作用域

四:装饰器

1:定义装饰器

例1:写一个简单的装饰器 (统计一个函数的运行时间)

如下函数
def test():
    time.sleep(1)
    print("hello world")
计算test函数的运行时间,如下

import time

def timmer(func):
    def test_time():
        start_time=time.time()
        func()  #这里执行的才是test函数
        stop_time=time.time()
        print("函数test的运行时间为%s"%(stop_time-start_time))
    return test_time

@timmer  #等同于test=timmer(test)
def test():
    time.sleep(1)
    print("hello world")

test() #这里实际执行的是test_time函数
总结:整个过程中,timmer函数中func接收的参数为test函数的内存地址,timmer函数的返回值为test_time函数的内存地址

如果我们需要统计多个函数的运行结果,那么我们就在被修饰函数前加上@timmer功能

例2:计算多个函数的运行时间如下

import time

#装饰器,添加计算时间的功能
def timmer(func):
    def test_time():
        start_time=time.time()
        func()
        stop_time=time.time()
        print("函数运行时间为%s"%(stop_time-start_time))
    return test_time

#函数1
@timmer
def test():
    time.sleep(1)
    print("这是test函数")

@timmer
def test1():
    time.sleep(2)
    print("这是test1函数")

test()
test1()

2:为装饰器加上返回值

import time

#装饰器,添加计算时间的功能
def timmer(func):
    def test_time():
        start_time=time.time()
        test_return=func()   #这里接收的是被修饰函数的返回值
        stop_time=time.time()
        print("函数运行时间为%s"%(stop_time-start_time))
        return test_return  #作为test_time的返回值
    return test_time

#函数1
@timmer
def test():
    time.sleep(1)
    print("这是test函数")
    return "这是test的返回值"

@timmer
def test1():
    time.sleep(2)
    print("这是test1函数")
    return "这是test1的返回值"

print(test())   #接收test_time的返回值
print(test1())

猜你喜欢

转载自blog.csdn.net/spades_linux/article/details/81220326