目录
定义
装饰器是Python编程语言中一种强大的函数工具,用于修改其他函数的功能。它们允许在不修改被装饰函数源代码的情况下,通过添加额外的代码来包装、扩展或改变函数的行为。
装饰器是一个函数,它接受一个函数作为输入,并返回一个新的函数作为输出。这个新的函数通常在原始函数执行前后执行额外的操作,例如修改函数的参数、修改返回值、记录日志、执行计时等。通过装饰器,可以轻松地在代码中实现这些横切关注点(cross-cutting concerns)。
装饰器可以使用@符号放在函数定义的上方,从而自动应用于该函数。当调用被装饰的函数时,实际上是调用了装饰器返回的新函数。
下面通过一个简单例子来说明:
质数判断例子
# -*- coding:utf-8 -*-
import time
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(): #打印出1至10000之间的质数,并记录打印所需时间
t1 = time.time()
for i in range(2, 10000):
if is_prime(i):
print(i)
t2 = time.time()
print(t2-t1)
prime_nums()
运行结果:
使用装饰器,将时间逻辑和计数逻辑分开:
# -*- coding:utf-8 -*-
import time
def display_time(func): #时间逻辑
def wrapper():
t1 = time.time()
func()
t2 = time.time()
print(t1-t1)
return wrapper
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
@display_time #调用prime_nums时,会先调用display_time
def prime_nums(): #打印出1至10000之间的质数,计数逻辑
for i in range(2, 10000):
if is_prime(i):
print(i)
prime_nums()
运行结果:
记录1至10000质数总数:
# -*- coding:utf-8 -*-
import time
def display_time(func): #时间逻辑
def wrapper():
t1 = time.time()
result = func()
t2 = time.time()
print("Total time:{:.4}s".format(t2 - t1))
return result
return wrapper
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
@display_time
def count_prime_nums(): #打印出1至10000之间的质数个数
count = 0
for i in range(2, 10000):
if is_prime(i):
count = count+1
return count
number = count_prime_nums()
print(number)
运行结果:
可调整参数代码修改
eg:1~5000中的质数,计数范围可变
# -*- coding:utf-8 -*-
import time
def display_time(func):
def wrapper(*args):
t1 = time.time()
result = func(*args)
t2 = time.time()
print("Total time:{:.4}s".format(t2 - t1))
return result
return wrapper
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
@display_time
def count_prime_nums(maxnum):
count = 0
for i in range(2, maxnum):
if is_prime(i):
count = count+1
return count
number = count_prime_nums(5000)
print(number)
运行结果: