装饰器概念
- 装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic。
实例
简单示例
我们先来写一个简单的函数,比如求质数。
def is_prime(num):
if num < 2:
return False
elif num == 2:
return True
else:
for i in range(2,num):
if num%i == 0:
return False
return True
现在我们再来写一个输出质数的函数
def prime_nums():
for i in range(2,10000):
if is_prime(i):
print(i)
通过调用is_prime函数,判断2~10000之间的质数。
如果我们要统计这个函数所需要的时间,那我们就需要使用time模块计算时间。
def prime_nums(maxnum):
start = time.time()
for i in range(2,maxnum):
if is_prime(i):
print(i)
end = time.time()
result = end-start
print(result)
这样我们基本就能知道这个函数运行结束需要多久了,
装饰器作用
如果我们有很多的函数需要这样计算运行时间,总不能每一个函数都像这样写一遍time.time()吧,这时python的装饰器就起到了很方便的作用。
计时装饰器(不带参数,无返回值)
我们来写一个计算时间的装饰器
def display_time(func):
def wapper():
t1 = time.time()
func()
t2 = time.time()
print(t2 - t1)
return wapper
display_time函数中的参数func就是我们需要使用装饰器的函数,也就是把func这个函数当作参数传入到了display_time这个函数中。
然后在wapper这个函数中调用了这个传入的函数。
@display_time
def prime_nums():
for i in range(2,10000):
if is_prime(i):
print(i)
在需要使用装饰器的函数上加上@装饰器,即可使用装饰器的功能。
我们再来运行一次
可以看到效率基本一致,我们的计算功能也实现了。
带返回值装饰器
如果我们要判断质数的函数中质数的数量,并且有返回值,装饰器怎么修改。
@display_time
def prime_nums():
count = 0
for i in range(2,10000):
if is_prime(i):
print(i)
count += 1
return count
因为函数有返回值,所以装饰器中页需要用一个变量接收。
def display_time(func):
def wapper():
t1 = time.time()
result = func()
t2 = time.time()
print(t2 - t1)
return result
return wapper
带参数装饰器
如果函数需要传参呢
@display_time
def prime_nums(maxnum):
count = 0
for i in range(2,maxnum):
if is_prime(i):
print(i)
count += 1
return count
我们使用*args接收函数即可。
def display_time(func):
def wapper(*args):
t1 = time.time()
result = func(*args)
t2 = time.time()
print(t2 - t1)
return result
return wapper
最后调用函数,得到的结果与我们需求的一致。