1.什么是閉包
閉包是函數(shù)的內部函數(shù)校翔,對外部作用域而非全局作用域的引用滤港∈竺幔可以打破層級關系添寺,把外部的變量封裝到內部函數(shù)中使用,直接在外面調用懈费。
x = 10
def f1(x):
def f2():
print(x)
return f2 # 把f2函數(shù)當做一個返回值返回給f1.
f2 =f1(1) # f1()就相當于把f2的值拿到计露,然后在賦值給一個變量名為f2。
f2()
2.函數(shù)的兩種傳參方式
def f(x):
print(x)
def outter(func):
def warpper(*args,**kwargs):
return func()
return warpper
f = outer(func)
f()
閉包的意義
返回的函數(shù)對象憎乙,不僅僅是函數(shù)結果票罐,還包含了外面一層函數(shù)。這使得函數(shù)無論如何調用寨闹,優(yōu)先調用外面一層參數(shù)胶坠。
應用領域:爬蟲等
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()
裝飾器
什么是裝飾器
裝飾器也是一個函數(shù),可以將原函數(shù)已閉包的形式傳入新的函數(shù)中繁堡,達到不修改原函數(shù)而增加新功能的效果沈善。
裝飾器的功能:
不修改原函數(shù)
不修改原函數(shù)的調用方式
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)