python中装饰器、闭包

1 装饰器目的

  • 装饰器本质也是函数
  • 比如对函数运行时间统计,可以用一个装饰器函数实现,就不用对每个需要统计时间的函数,都写一遍时间统计的语句了
  • 或者是不修改原来的函数,进行函数重构

2 一个统计函数运行时间的装饰器

import time

def is_prime(num):
    #判断单个数是否为质数
    if num < 2:
        return False
    elif num == 2:
        return True
    else:
        for i in range(2, int(num / 2) + 1):
            if num % i == 0:
                return False
        return True

def cal_time(func):
    def wrapper(*args):
    # 重点关注*args代表不知道多少个参数,参数个数和原函数一致
        start_time = time.time()
        result = func(*args)
        end_time = time.time()
        print('Total time {:.4}'.format(end_time - start_time))
        return result
    return wrapper

@cal_time
def count_prime_nums(maxnum):
    count = 0
    for i in range(2, maxnum):
        if is_prime(i):
            count += 1
    return count


if __name__ == '__main__':
    print(is_prime(4))
    count = count_prime_nums(10000)
    print(count)

  • 注意被装饰的函数,有入参,有返回值时,装饰器函数的写法
  • return wrapper,装饰器函数中返回的是内层函数名,type为<class 'function'>

3 装饰器与闭包。

  • 装饰器是闭包的一种。闭包和装饰器的区别:闭包传递的是变量,而装饰器传递的是函数,除此之外没有任何区别,或者说装饰器是闭包的一种,它只是传递函数的闭包。

  • 创建一个闭包需要满足以下几点:

    • 必须有一个内嵌函数
    • 内嵌函数必须引用外部函数中的变量
    • 外部函数的返回值必须是内嵌函数
    def out(N):
      def inner(M):
          return N * M
      return inner
        
    
posted @ 2022-06-11 00:13  qwaszx1!  阅读(149)  评论(0)    收藏  举报
HTML