Python装饰器

其实是上课老师讲了之后还是不太明白,所以在网上看了看,有如下总结(都说了是网上的哦)
简陋版本,不喜勿喷!

判断并输出质数

首先需要一个判断是否是质数的函数

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.017

给予指定参数

如果我的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.025(我在这里将参数写为100了)

有人说装饰器其实就是一个闭包,至于闭包是什么,先不说hhhhh(因为还没有系统的学习~)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值