其实是上课老师讲了之后还是不太明白,所以在网上看了看,有如下总结(都说了是网上的哦)
简陋版本,不喜勿喷!
判断并输出质数
首先需要一个判断是否是质数的函数
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,61):
if is_prime(i):
print(i)
prime_nums()
结果:
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
计时器⏲
如果我们需要一个计时器来计算用了多长时间呢?
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():
t1=time.time() #计时部分
for i in range(2,61):
if is_prime(i):
print(i)
#逻辑部分
t2=time.time() #计时部分
print(t2-t1)
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
def display_time(func): #参数也是个函数,是接下来要运行的函数
def wrapper():
t1=time.time()
func() #运行我要走的函数
t2=time.time()
print(t2-t1)
return wrapper
@display_time #如果要运行装饰器,只需要在要被运行的函数上面@+装饰器函数
def prime_nums():
for i in range(2,61):
if is_prime(i):
print(i)
prime_nums()
结果:
0.001993417739868164
这里我只写了时间......
进一步统计质数个数
那么,如果是统计一下有多少个质数呢?
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 display_time(func):
def wrapper():
t1=time.time()
func() #运行我要走的函数
t2=time.time()
print(t2-t1)
return wrapper
@display_time
def count_prime_nums():
count=0
for i in range(2,61):
if is_prime(i):
count+=1
return count
count=count_prime_nums()
print(count)
结果:
0.0(时间)
None (质数个数)
嗯,为什么没有返回值?
去装饰器wrapper里面,把返回值再次返回出来
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 display_time(func):
def wrapper():
t1=time.time()
result=func()
t2=time.time()
print("Total time:",t2-t1)
return result
return wrapper
@display_time
def count_prime_nums():
count=0
for i in range(2,61):
if is_prime(i):
count+=1
return count
count=count_prime_nums()
print(count)
结果:
Total time: 0.0(时间太短所以显示0.0)
17
给予指定参数
如果我的count_prime_nums()带了参数maxnum了呢?
那就在装饰器的wrapper里面再加一个参数
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 display_time(func):
def wrapper(*args): #"*args"意思是不知道有多少个参数,有几个就带进去几个
t1=time.time()
result=func(*args)
t2=time.time()
print("Total time:",t2-t1)
return result
return wrapper
@display_time
def count_prime_nums(maxnum):
count=0
for i in range(2,maxnum):
if is_prime(i):
count+=1
return count
count=count_prime_nums(100)
print(count)
结果:
Total time: 0.0(时间太短所以显示0.0)
25(我在这里将参数写为100了)
有人说装饰器其实就是一个闭包,至于闭包是什么,先不说hhhhh(因为还没有系统的学习~)