闭包的意义:

返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域 

#应用领域:延迟计算(原来我们是传参,现在我们是包起来)

from urllib.request import urlopen      

def index(url):         

    def get():             

    return urlopen(url).read()         

   return get      

baidu=index('http://www.baidu.com')     

print(baidu().decode('utf-8'))

装饰器: 

装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。 强调装饰器的原则:

1 不修改被装饰对象的源代码 

2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能

装饰器其根本就是闭包函数  

装饰器语法

被装饰函数的正上方,单独一行        

@deco1         

@deco2         

@deco3         

def foo():             

  pass          

foo=deco1(deco2(deco3(foo))) 

装饰器补充:wraps

from functools import wraps

def deco(func):

    @wraps(func) #加在最内层函数正上方

    def wrapper(*args,**kwargs):

        return func(*args,**kwargs)

    return wrapper

@deco

def index():

    '''哈哈哈哈'''

    print('from index')

print(index.__doc__)