美文网首页
python Decorator (装饰器)

python Decorator (装饰器)

作者: Elliot_王大爷 | 来源:发表于2019-10-16 10:05 被阅读0次

    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)
    
    

    相关文章

      网友评论

          本文标题:python Decorator (装饰器)

          本文链接:https://www.haomeiwen.com/subject/pojymctx.html