淺談Python從全局與局部變量到裝飾器的相關知識
全局變量與局部變量
# num1是全局變量 num1 = 1 # num2是局部變量 def func(): num2 = 2
在函數外(且不在函數裡)定義的變量是全局變量;
在函數裡定義的變量是局部變量。
在函數外無法引用局部變量,但在函數裡面可以引用全局變量,不過需要註意的是,一般函數裡不能修改全局變量,如果在函數裡修改全局變量,那麼python會自動創建一個與之名字相同的變量,使用global關鍵字可以將局部變量變為全局變量,進而修改。
# 這是全局變量 num1 = 1 # 函數裡的num1是局部變量 def func1(): num1 = 2 #調用函數 func1() # 輸出num1來驗證全局變量是否改變 print(num1) # 輸出為1 # 定義局部變量num2 def func2(): num2 = 2 # 嘗試在函數外引用局部變量 print(num2) # 輸出:NameError: name 'num2' is not defined # 在函數裡引用全局變量 def func3(): print(num1) # 調用函數 func3() # 輸出:1 # 使用global關鍵字來修改局部變量 def func4(): global num1 num1 = 2 # 調用函數 func4() # 驗證num1是否被修改 print(num1) # 輸出為2
內嵌函數
# 在函數內部定義另一個函數,這種函數稱為內嵌函數或者內部函數 def func1(): num1 = 1 def func2(): num2 = 2 # num1和num2都是局部變量 # 我們稱func2是內部函數,而func1是外部函數 # 內部函數的作用域在整個外部函數裡面,且內部函數可以引用外部函數裡的局部變量
LEGB原則:
• L-Local:函數內的名字空間。
• E-Enclosing function locals:嵌套函數中外部函數的名字空間。
• G-Global:函數定義所在模塊的名字空間。
• B-Builtin:Python內置模塊的名字空間。
變量的查找順序依次是L→E→G→B。
內部函數中,隻能對外部函數的局部變量進行訪問,但一般不能進行修改。(這一點和全局變量與局部變量一樣),使用nonlocal關鍵字可以進行修改
閉包
Python中的閉包:封閉環境中的函數
定義:如果在一個內部函數裡,對在外部作用域但不是在全局作用域的變量進行引用(簡言之:就是在嵌套函數的環境下,內部函數引用瞭外部函數的局部變量),那麼內部函數就被認為是閉包
註:因為閉包的概念是由內部函數而來,所以不能在外部函數以外的地方對內部函數進行調用。
def func1(): num1 = 1 def func2(): print(num1) return func2 func3 = func1() func3()
閉包的作用:為瞭盡可能地避免使用全局變量,閉包允許將函數與其所操作的某些數據(環境)關聯起來,這樣外部函數就為內部函數構成瞭一個封閉的環境
裝飾器
裝飾器:在Python中裝飾器(decorator)的功能是將被裝飾的函數當作參數傳遞給與裝飾器對應的函數(名稱相同的函數),並返回包裝後的被裝飾的函數。
def func1(func2): def func3(): print("程序開始執行 ") func2() print("程序結束執行") return func3 # **必須返回函數,如果後面加括號,那麼內部返回的函數會直接執行** def func4(): print("hello world") func4 = func1(func4) func4() # 輸出: '''程序開始執行 hello world 程序結束執行'''
大多數裝飾器會定義內部函數,但是為瞭方便,也可以不在內部定義函數,而是直接讓裝飾器返回原來的函數。但當我們定義的函數中有參數時,就必須在內部定義一個函數。但建議使用內部函數,因為內部函數內的代碼不會在傳遞過程直接執行
@語法糖
@語法糖可以快速將原函數當成參數傳遞給外部函數並返回給與原函數名字相同的新函數
def func1(func2): def func3(): print("程序開始執行 ") func2() print("程序結束執行") return func3 # **必須返回函數,如果後面加括號,那麼內部返回的函數會直接執行** @func1 def func4(): print("hello world") func4()
對於裝飾器,加入內部函數參數[,收集參數],可以實現更多的功能
另外還有參數化裝飾器,疊放裝飾器,完善裝飾器,以及一些內置裝飾器可以用來更深度的學習
到此這篇關於淺談Python從全局與局部變量到裝飾器的相關知識的文章就介紹到這瞭,更多相關Python全局與局部變量到裝飾器內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python函數命名空間和作用域(Local與Global)
- Python全棧之作用域和閉包
- python變量作用域與列表入門詳解
- Python 局部變量global詳解
- Python 中閉包與裝飾器案例詳解