閉包淺談
如需轉發,請註明出處:小婷兒的python https://www.cnblogs.com/xxtalhr/p/10261902.html
閉包
一、概念
內部函式可以引用外部函式的引數和區域性變數,當外部函式返回內部函式時,相關引數和變數都儲存在返回的函式中,這種稱為“閉包(Closure);即,閉包是兩個函式的巢狀,外部函式返回內部函式的引用,外部函式一定要有引數。
1 def 外部函式(引數): 2 def 內部函式(): 3 pass 4 return 內部函式
二、閉包與正常函式的區別:
l 閉包格式是兩個函式的巢狀;
l 閉包外部函式的引數可以在記憶體中保持;
l 閉包函式就如同一個“類”,只有在該閉包函式裡的方法才可以使用其區域性變數,閉包函式之外的方法是不能讀取其區域性變數的。這就實現了面向物件的封裝性,更安全更可靠,即閉包裡面的資料是獨有的資料,與外界無影響;
l 函式:函式中,需要使用的全域性變數,在一定程度上是受到限制的,因為全域性變數不僅僅是一個函式使用,其他的函式也可能會使用到,一旦修改會影響到其他函式使用全域性變數,所以全域性變數不能隨便修改從而在函式的使用中受到一定侷限性。
三、練習
例一、求和
1 def func_out(*args): #定義內內部函式 2 def func_in(): #使用外部函式的args變數 3 sumV = sum(args) 4 return sumV #返回內部函式 5 return func_in 6 7 S = func_out(1, 2, 3, 2) 8 print(S()) #真正呼叫的是func_in函式
例二、判斷成績是否合格
1 def pass_out(scoreLine): 2 deftrue_score(score): 3 if score >= scoreLine: 4 print('合格') 5 else: 6 print('不合格') 7 return true_score 8 total_score_100 = pass_out(60) 9 total_score_150 = pass_out(90) 10 total_score_100(90) 11 total_score_150(60)
例三、申明變數
1 def func_outer(numb): 2 def func_inner(): 3 # nonlocal是閉包內部變數的宣告:宣告變數不是區域性變數,這樣下方的程式碼可以對外部函式傳入的變數進行修改 4 nonlocal numb 5 numb += 1 6 return numb 7 8 return func_inner 9 10 11 ret = func_outer(66) # 得到內部函式inner的指向 12 print(ret()) # 呼叫inner函式,並列印inner函式的返回值 結果為67
歡迎關注小婷兒的部落格:
部落格園:http://www.cnblogs.com/xxtalhr/
csdn:https://blog.csdn.net/u010986753
有問題請在部落格下留言或加作者微信:tinghai87605025 或 QQ :87605025
python QQ交流群:py_data 483766429
OCP培訓說明連線:https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA
OCM培訓說明連線:https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA
小婷兒的python正在成長中,其中還有很多不足之處,隨著學習和工作的深入,會對以往的部落格內容逐步改進和完善噠。
重要的事多做幾遍。。。。。。