python高级模块
01 装饰器
import time
'''
普通函数: 统计 N 以内所有的质数之和
'''
def get_prime_sum_temp(n):
sum = 0
for i in range(2, n + 1):
flag = True
for j in range(2, i):
if i % j == 0:
flag = False
break
if flag:
sum += i
return sum
'''
当 N 发生变化的时候,函数消耗的时间和返回的值都会不一样。
我们需要统计一下该函数的方法名、注释内容、入参、返回值和消耗时间
'''
def decorator_name(func):
def wrapper(*args, **kwargs):
... # 编写额外功能的代码
return func(*args, **kwargs)
return wrapper
普通装饰器
'''
在装饰器中,需要接收一个函数 func 作为参数,同时它也会返回一个函数 wrapper。
在 wrapper(*args, **kwargs) 中,可以接收任意参数,
首先会执行我们编写额外功能的代码,最后再调用原始函数。
'''
def log(func):
def wrapper(*args, **kwargs):
'''我是 wrapper 的注释'''
start_time = time.time()
res = func(*args, **kwargs)
end_time = time.time()
print(f'函数名:{
func.__name__}')
print(f'函数注释内容:{
func.__doc__}')
print(f'函数args入参:{
args}')
print(f'函数kwargs入参:{
kwargs}')
print(f'函数返回值:{
res}')
print(f'函数消耗时间:{
start_time - end_time}')
return res
return wrapper
@log
def get_prime_sum(n):
'''我是 get_prime_sum 的注释'''
sum = 0
for i in range(2, n + 1):
flag = True
for j in range(2, i):
if i % j == 0:
flag = False
break
if flag:
sum += i
return sum
get_prime_sum(5)
带参数的装饰器
上面例子中创建的装饰器是不带参数的,如果我们想对装饰器本身传入参数,那么就需要把上面函数改成一个返回装饰器的函数,这时候就需要来个3层嵌套。
例如,我们想在使用装饰器时,增加一个 delay 参数,该参数的作用是让程序执行后延迟一段时间,修改装饰器后的代码如下:
def log(delay=0):
def decorator(func):
def wrapper(*args, **kwargs):
'''我是 wrapper 的注释'''
start_time = time.time()
res = func(*args, **kwargs)
time.sleep(delay) # 延迟 delay 秒
end_time = time.time()
print(f'额外的参数:{
delay}')
print(f'函数名:{
func.__name__}')
print(f'函数注释内容:{
func.__doc__}')
print(f'函数args入参:{
args}')
print(f'函数kwargs入参:{
kwargs}'