欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python 之进阶函数 (装饰器)

程序员文章站 2023-11-20 10:06:16
今天我们主要讲解一部分的装饰器,从最简单的装饰器,到带返回值的装饰器,到带参数的装饰器,最后到固定装饰器 在开始讲装饰器之前,我们要像讲两个知识点,一个是time模块和语法糖 1)time模块 time.time() :某段程序的执行时间 time.sleep() :睡眠,(time)中可以添加参数 ......

  今天我们主要讲解一部分的装饰器,从最简单的装饰器,到带返回值的装饰器,到带参数的装饰器,最后到固定装饰器

在开始讲装饰器之前,我们要像讲两个知识点,一个是time模块和语法糖

1)time模块

  time.time()   :某段程序的执行时间

  time.sleep() :睡眠,(time)中可以添加参数,time表示时间

  针对time.time(),我们在使用的时候我们可以把它放在需要测速的代码的上下,这样就可以检测当前代码的运行时间

  由于有的时候,某段程序执行速度过快,所以我们可以time.sleep()来增加它的初始时间。防止检测值是 0.0

2)语法糖:@装饰函数名

 

装饰器:

 

1.最简单的装饰器

def timer(f):
#闭包,这里闭包的不是变量,而是形参f
def inner():
time.time()
f()
time.time()
return inner

def func():
print('hello ,装饰器')
time.sleep(0.1)

2.带返回值的装饰器

def timmer(f):      #装饰器函数,它的形参一定是被装饰函数
def inner():
start = time.time() #函数开始前书写区域
x = f() #接受func的返回值
end = time.time() #函数开始后书写区域
print(end - start)
return x #inner的返回值
return inner #timmer的返回值

@timmer # @装饰器函数名 ,它的下面一定是被装饰函数
def func():
print('你好,我要开始默写带返回值的装饰器了')
time.sleep(0.1)
return 'hello'

f1 = func()
print(f1)

timmer有返回值,返回值是inner(),所有我们调用timmer,就是调用函数inner(),然后查看inner是否有返回值,
然后最开始inner()也是没有返回值,所以用一个变量来接受装饰器函数,并且返回该变量,这个时候inner的返回值就是
变量ret,所以当我们调用timmer函数的时候,返回值是ret的内容
 

3.带参数的装饰器

def timmer(f):      #装饰器函数,它的形参一定是被装饰函数
def inner():
start = time.time() #函数开始前书写区域
x = f() #接受func的返回值
end = time.time() #函数开始后书写区域
print(end - start)
return x #inner的返回值
return inner #timmer的返回值

@timmer # @装饰器函数名 ,它的下面一定是被装饰函数
def func(a):
print('你好,我要开始默写带返回值的装饰器了')
time.sleep(0.1,a)
return 'hello'

f1 = func(1)
print(f1)

4.固定装饰器

def wrapper(f):
def inner(*args,**kwargs):
ret = f(*args,**kwargs)
print('count')
return ret
return inner
@wrapper
def conf(a,b):
print(a,'+',b)
return 'hello'
x = conf(12,23)

  通过对装饰器的学习,逐渐理解了装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数中添加内容