python中装饰器、闭包
1 装饰器目的
- 装饰器本质也是函数
- 比如对函数运行时间统计,可以用一个装饰器函数实现,就不用对每个需要统计时间的函数,都写一遍时间统计的语句了
- 或者是不修改原来的函数,进行函数重构
2 一个统计函数运行时间的装饰器
import time
def is_prime(num):
#判断单个数是否为质数
if num < 2:
return False
elif num == 2:
return True
else:
for i in range(2, int(num / 2) + 1):
if num % i == 0:
return False
return True
def cal_time(func):
def wrapper(*args):
# 重点关注*args代表不知道多少个参数,参数个数和原函数一致
start_time = time.time()
result = func(*args)
end_time = time.time()
print('Total time {:.4}'.format(end_time - start_time))
return result
return wrapper
@cal_time
def count_prime_nums(maxnum):
count = 0
for i in range(2, maxnum):
if is_prime(i):
count += 1
return count
if __name__ == '__main__':
print(is_prime(4))
count = count_prime_nums(10000)
print(count)
- 注意被装饰的函数,有入参,有返回值时,装饰器函数的写法
return wrapper
,装饰器函数中返回的是内层函数名,type为<class 'function'>
3 装饰器与闭包。
-
装饰器是闭包的一种。闭包和装饰器的区别:闭包传递的是变量,而装饰器传递的是函数,除此之外没有任何区别,或者说装饰器是闭包的一种,它只是传递函数的闭包。
-
创建一个闭包需要满足以下几点:
- 必须有一个内嵌函数
- 内嵌函数必须引用外部函数中的变量
- 外部函数的返回值必须是内嵌函数
def out(N): def inner(M): return N * M return inner