【笔记】Python基础五

一,什么是装饰器

本质就是函数,功能是为其他函数添加附加功能

原则:

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

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

例子:

import time

def timmer(func):
    def wapper(*args, **kwargs):
        start_time = time.time()
        res = func(*args, **kwargs)
        stop_time = time.time()
        print('函数的运行时间 %s' % (stop_time - start_time))
        return res
    return  wapper

@timmer      #加装饰器
def cal(l):  #原函数
    res = 0
    time.sleep(1)
    for i in l:
        res += i
    return res

t1 = cal(range(100))
print(t1)
'''输出:
函数的运行时间 1.0000572204589844
4950
'''

二,装饰器的知识储备

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

(一)高阶函数

定义:

扫描二维码关注公众号,回复: 5078729 查看本文章

1,函数接受的参数是一个函数名

2,函数的返回值是一个函数名

3,满足上述条件任意一个,都可称之为高阶函数

例子:高阶函数

def foo():
    print('你好啊林师傅')

def test(func):
    print(func) #打印内存地址
    func()      #执行函数foo

test(foo) #test是高阶
'''输出:
<function foo at 0x00000000022F22F0>
你好啊林师傅
'''

例子:函数接受的参数是一个函数名,就能实现给函数增加功能的目标

def foo():
    time.sleep(3)
    print('你好啊林师傅')

def test(func):
    start_time = time.time()
    func()      #执行函数foo
    stop_time = time.time()
    print('函数的运行时间 %s' % (stop_time - start_time))

test(foo) #修改了函数原来的调用方式,原来是foo()
'''输出:
你好啊林师傅
函数的运行时间 3.000171661376953
'''

例子:如果再加上返回值是一个函数,则能实现“不修改被修饰函数的调用方式”这一个条件

def foo():
    print('from the foo')
def test(func):
    return func

# res = test(foo)
# print(res) #res得到的是foo的内存地址
# res()      #实际是运行foo
foo = test(foo) #如果把函数的执行结果重新赋值给foo函数名
foo()           #就能实现“不修改被修饰函数的调用方式”这一个条件
'''输出:
from the foo
'''

例子:多运行一次例子,并不合格(高阶函数并不能全部满足装饰器的需要)                1,不修改foo源代码,2,不修改foo调用方式

def foo():
    time.sleep(3)
    print('from the foo')

def timer(func):
    start_time = time.time()
    func()      #执行函数foo
    stop_time = time.time()
    print('函数的运行时间 %s' % (stop_time - start_time))
    return func

foo = timer(foo) 
foo()           #又执行了一次函数foo  
'''输出:
from the foo
函数的运行时间 3.007171869277954
from the foo
'''

猜你喜欢

转载自www.cnblogs.com/fudonghai/p/10323608.html
今日推荐