1.闭包

闭包:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。

在Python中创建一个闭包可以归结为以下三点:

  • 闭包函数必须有内嵌函数
  • 内嵌函数需要引用该嵌套函数上一级namespace中的变量
  • 闭包函数必须返回内嵌函数
1 def fun(x):
2     def add(y):
3         return x+y
4     return add
5 d=  fun(2)
6 print(d(1)) # 3
7 print(d(3)) # 5

2.装饰器

  • 装饰器本身是一个函数,用于装饰其它函数,增强被装饰函数的功能,装饰器一般接受一个函数对象作为参数,已对其进行增强。
  • 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
import time  
def timeit(func):  
    # 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法 
    def wrapper(): 
        # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
        start = time.clock()  
        func()  
        end =time.clock()  
        print("time %.4f"%(end-start))

    # 将包装后的函数返回  
    return wrapper  
 
@timeit  
def fun(): 
    for i in range(10000):pass
    print("this test fun!")   

fun()
# --------------------------------------------------
# this test fun!
# time 0.0009

 

#我们可以使用 Python 内置模块functools中的wraps工具,实现“在使用装饰器扩展函数功#能的同时,保留原函数属性”这一目的。这里functools.wraps本身也是一个装饰器。运行效果如下

>>> import functools
>>> # 定义保留原函数属性的装饰器
... def IAmDecorator(fun):
...     @functools.wraps(fun)
...     def wrapper(*args, **kw):
...         print("我真的是一个装饰器")
...         return fun(*args, **kw)
...     return wrapper
...
>>> @IAmDecorator
... def func():
...     print("我是原函数")
...
>>> func.__name__
'func'

  

 posted on 2020-08-08 00:15  boye169  阅读(135)  评论(0编辑  收藏  举报