Python 装饰器Python 装饰器
Decorator
使用kotlin的时候发现有个函数很好玩 measureTimeMillis
统计函数的使用时间的。一下子就想到python里面的装饰器.
讲一下 为什么要使用装饰器,什么场景下会使用。举个例子
这是一个输出2-10000之间的所有质数
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
# 输出2 - 10000 之间的所有质数
def prime_nums():
for i in range(2, 10000):
if is_prime(i):
print(i)
prime_nums()
现在加一个小小的需求,比如想知道这段代码的执行的时间。
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
# 输出2 - 10000 之间的所有质数
def prime_nums():
start = time.time()
for i in range(2, 10000):
if is_prime(i):
print(i)
end = time.time()
print(end - start)
prime_nums()
像这样的代码 ,应该都会写吧。逻辑也不复杂,但是里面有个小小的问题,就是 prime_nums()
这个方法里面既有逻辑的部分 又包含有计时的部分,可读性比较差,要是有更多的函数 也需要计时部分,是不是都要写一个 开始时间,结束时间。 这个时候 就可以用到装饰器了。代码如下 @display_time
:
import time
def display_time(func):
def wrapper():
start = time.time()
func()
end = time.time()
print("时间: {:.4} s".format(end - start))
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
# 输出2 - 10000 之间的所有质数
@display_time
def prime_nums():
for i in range(2, 10000):
if is_prime(i):
print(i)
prime_nums()
接下来 又来一个小需求,就是我想统计一下 2-10000之间有多少质数 又该怎么处理呢。
import time
def display_time(func):
def wrapper():
start = time.time()
# 记录一下返回值
result = func()
end = time.time()
print(end - start)
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
# 输出2 - 10000 之间的所有质数
@display_time
def prime_nums():
count = 0
for i in range(2, 10000):
if is_prime(i):
# print(i)
count += 1
return count
count = prime_nums()
print(count)
接下来 又有一个小需求,我想知道2-任意数 之间的所有质数。这个时候 就得对prime_nums()
函数增加参数了,这个时候的装饰器应该怎么写呢。
import time
def display_time(func):
# 增加参数
def wrapper(*args):
start = time.time()
# 记录一下返回值
result = func(*args)
end = time.time()
print("时间: {:.4} s".format(end - start))
# 把函数的结果再次返回出去
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
# 输出2 - 10000 之间的所有质数
@display_time
def prime_nums(max):
count = 0
for i in range(2, max):
if is_prime(i):
# print(i)
count += 1
return count
count = prime_nums(10000)
print(count)
Decorator
使用kotlin的时候发现有个函数很好玩 measureTimeMillis
统计函数的使用时间的。一下子就想到python里面的装饰器.
讲一下 为什么要使用装饰器,什么场景下会使用。举个例子
这是一个输出2-10000之间的所有质数
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
# 输出2 - 10000 之间的所有质数
def prime_nums():
for i in range(2, 10000):
if is_prime(i):
print(i)
prime_nums()
现在加一个小小的需求,比如想知道这段代码的执行的时间。
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
# 输出2 - 10000 之间的所有质数
def prime_nums():
start = time.time()
for i in range(2, 10000):
if is_prime(i):
print(i)
end = time.time()
print(end - start)
prime_nums()
像这样的代码 ,应该都会写吧。逻辑也不复杂,但是里面有个小小的问题,就是 prime_nums()
这个方法里面既有逻辑的部分 又包含有计时的部分,可读性比较差,要是有更多的函数 也需要计时部分,是不是都要写一个 开始时间,结束时间。 这个时候 就可以用到装饰器了。代码如下 @display_time
:
import time
def display_time(func):
def wrapper():
start = time.time()
func()
end = time.time()
print("时间: {:.4} s".format(end - start))
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
# 输出2 - 10000 之间的所有质数
@display_time
def prime_nums():
for i in range(2, 10000):
if is_prime(i):
print(i)
prime_nums()
接下来 又来一个小需求,就是我想统计一下 2-10000之间有多少质数 又该怎么处理呢。
import time
def display_time(func):
def wrapper():
start = time.time()
# 记录一下返回值
result = func()
end = time.time()
print(end - start)
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
# 输出2 - 10000 之间的所有质数
@display_time
def prime_nums():
count = 0
for i in range(2, 10000):
if is_prime(i):
# print(i)
count += 1
return count
count = prime_nums()
print(count)
接下来 又有一个小需求,我想知道2-任意数 之间的所有质数。这个时候 就得对prime_nums()
函数增加参数了,这个时候的装饰器应该怎么写呢。
import time
def display_time(func):
# 增加参数
def wrapper(*args):
start = time.time()
# 记录一下返回值
result = func(*args)
end = time.time()
print("时间: {:.4} s".format(end - start))
# 把函数的结果再次返回出去
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
# 输出2 - 10000 之间的所有质数
@display_time
def prime_nums(max):
count = 0
for i in range(2, max):
if is_prime(i):
# print(i)
count += 1
return count
count = prime_nums(10000)
print(count)
网友评论