函數有三種形式
1.定義形式
2.對象形式(函數變量)
3.調用形式
def outer():
str1 = "我是outer函數str1"
print(str1)
def inner():
str1 = "我是inner函數str1"
print(str1)
return inner
f=outer()
f()
#結果:
#我是outer函數str1
#我是inner函數str1
函數嵌套
函數的嵌套即在函數內部定義其他的函數。
def outer():
str1 = "我是outer函數str1"
print(str1)
def inner():#此處定義的函數即爲函數嵌套
str1 = "我是inner函數str1"
print(str1)
return inner
閉包
閉包:內部函數對其外部函數環境的引用。
條件一:函數要嵌套即存在內部函數和外部函數
條件二:內部函數使用其外函數的環境(即使用外部函數的變量)
條件三:內部函數在外部函數的外部使用。
對於C語言來說若外部函數結束則其內部的一切都結束並被釋放,閉包即是python特有的區別去C語言的特性,若外部函數outer返回內部函數inner,且內部函數inner使用了外部函數outer的變量,則該內部函數inner和外部函數的變量str1並不會被釋放而是依舊在inner中可以被使用。
裝飾器
前提:裝飾器是在閉包的基礎上建立的。
1.裝飾器本質上是一個python函數(一個返回函數的函數),它可讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數對象(閉包即如此)。
2.裝飾器經常用於有切面需求的場景,比如:插入日誌、性能測試、事務處理、緩存、權限校驗等場景。即爲已經存在的函數或對象添加額外的功能。
3.裝飾器:一個閉包,把一個函數當做參數返回一個替代的函數。
裝飾器函數步驟:
1.寫外部函數,傳入被修飾函數(即已有的函數或功能)
2.返回修飾後的內部函數
3.添加修飾動作(實現增加的功能),以及對被裝飾函數的處理
整體可以這樣理解:其實就是把被修飾函數穿了衣服變成了此處的內部函數inner
#舉例:爲已有函數增加打印日誌時函數名輸出功能
#已有函數
def hello():
print ("hello world!")
#第一步:傳入被修飾函數
def outer(func):#func將爲被修飾函數hello
def inner():
return func()#內部函數返回的是執行hello函數
pass
#第二步:返回內部修飾後的內部函數
def outer(func):#func將爲被修飾函數
def inner():
return func()#內部函數返回的是執行hello函數
return inner
#第三步
def outer(func):#func將爲被修飾函數
def inner():
print("[DEBUG]: enter {}()".format(func.__name__))
return func()#內部函數返回的是執行hello函數
return inner
#閉包
hello=outer(hello)
hello()
#裝飾器
@outer
def hello():
print ("hello world!")
hello()