python笔记十三(高阶函数、装饰器)

时间:2023-03-09 15:38:04
python笔记十三(高阶函数、装饰器)

一、高阶函数

函数只要有以下两个特征中一个就可以称为高阶函数:

  a:函数名作为一个实参传入另一个函数中

  b:函数的返回值中包含函数名

下面我们用代码来感受一下这两种形式:

import time
# 通过高阶函数将函数名作为参数传入,在不改变函数源代码的情况下为其添加功能
def bar():
time.sleep(3)
print("in the bar") def test1(func):
start_time = time.time()
func()
end_time = time.time()
print("in the function the cost time is :%s"%(end_time-start_time)) test1(bar)

  将函数名作为一个参数传入,这样就可以实现不修改函数源代码的情况下为其增加功能。

def bar():
time.sleep(3)
print("in the bar") def test2(func):
print(func)
return func
bar = test2(bar)
bar()

  返回值中包含函数名,这样就可以实现不修改函数的调用方式

  以上两点非常重要,是我们在接下来要将的装饰器能够实现的原理。

二、装饰器

  在搞清楚以上两个高阶函数的形式和可以实现的功能之后,我们就可以在此基础上实现装饰器。

  装饰器为了实现以下两个目的,一方面为已有的函数增加新的功能,另一方面要不改变函数的调用的方式。

  

import time

def timer(func):  #timer(test1) func = test1
def wrapper(*args,**kwargs): #这里加了*args和**kwargs就可以不限制被修饰参数的类型了
start_time = time.time()
func(*args,**kwargs)
stop_time = time.time()
print("the function runing time is %s"%(stop_time-start_time))
return wrapper @timer # test1 = timer(test1) =deco
def test1():
time.sleep(3)
print("in the test 1") #print(timer(test1)) 打印deco的内存地址
test1() #实际上在执行deco