1.什么是闭包
闭包是函数的内部函数,对外部作用域而非全局作用域的引用。可以打破层级关系,把外部的变量封装到内部函数中使用,直接在外面调用。
x = 10
def f1(x): 
    def f2():
        print(x)
    return f2 # 把f2函数当做一个返回值返回给f1.
f2 =f1(1) # f1()就相当于把f2的值拿到,然后在赋值给一个变量名为f2。
f2()
2.函数的两种传参方式
def f(x):
    print(x)
def outter(func):
    def warpper(*args,**kwargs):
        return func()
    return warpper
f = outer(func)
f()
闭包的意义
返回的函数对象,不仅仅是函数结果,还包含了外面一层函数。这使得函数无论如何调用,优先调用外面一层参数。
应用领域:爬虫等
import requests
def outter(url):  #outter() == spider ;spider() == response == requests.get(url)
    def spider():  # spider() == response
        response = requests.get(url)
        print(response.status_code)
        return response  
    return spider
baidu = outter('https://www.baidu.com')  # baidu == spider
baidu()
装饰器
什么是装饰器
装饰器也是一个函数,可以将原函数已闭包的形式传入新的函数中,达到不修改原函数而增加新功能的效果。
装饰器的功能:
不修改原函数
不修改原函数的调用方式
def deco(func):
    def wrapper(*args,**kwargs):
        start = time.time()
        res = func(*args,**kwargs)
        end = time.time()
        print(end - start)
        return res
    return wrapper
@deco
def time_sleep(x):
    time.sleep(x)
    print('from time_sleep',x)
time_sleep(3)