美文网首页
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