標籤:nbsp eva 定義 global display 記憶體位址 包含 技術分享 oca
本節要點:命名空間及範圍,函數嵌套,函數名本質,閉包
命名空間:
命名空間的本質:存放名字與值的綁定關係。
三種命名空間:
全域命名空間
局部命名空間
內建命名空間
三種命名空間之間的載入與取值順序:
載入順序:內建命名空間(程式運行前載入)->全域命名空間(程式運行中:從上到下載入)->局部命名空間(程式運行中:調用時才載入)
取值:
在局部調用:局部命名空間->全域命名空間->內建命名空間
在全域調用:全域命名空間->內建命名空間
範圍:
範圍就是作用範圍,按照生效範圍可以分為全域範圍和局部範圍。
全域範圍:包含內建名稱空間、全域名稱空間,在整個檔案的任意位置都能被引用、全域有效。
局部範圍:局部名稱空間,只能在局部範圍內生效。
globals和locals一個是全域,一個是局部。
函數的嵌套調用:
def max2(x,y): m = x if x>y else y return mdef max4(a,b,c,d): res1 = max2(a,b) res2 = max2(res1,c) res3 = max2(res2,d) return res3# max4(23,-7,31,11)
函數的嵌套調用
def f1(): print("in f1") def f2(): print("in f2") f2()f1()函數的嵌套定義(一)
def f1(): def f2(): def f3(): print("in f3") print("in f2") f3() print("in f1") f2() f1()函數的嵌套定義(二)
函數的範圍鏈:
def f1(): a = 1 def f2(): print(a) f2()f1()
範圍鏈(一)
def f1(): a = 1 def f2(): def f3(): print(a) f3() f2()f1()
範圍鏈(二)
def f1(): a = 1 def f2(): a = 2 f2() print(‘a in f1 : ‘,a)f1()
範圍鏈(三)
nonlocal關鍵字
# 1.外部必須有這個變數
# 2.在內建函式聲明nonlocal變數之前不能再出現同名變數
# 3.內部修改這個變數如果想在外部有這個變數的第一層函數中生效
def f1(): a = 1 def f2(): nonlocal a a = 2 f2() print(‘a in f1 : ‘,a)f1()
nonlocal關鍵字
函數名的本質:
函數名的本質就是存函數的記憶體位址
1.可以被引用
2.可以被當作容器類型的元素
3.可以當作函數的參數和傳回值
小總結:就當變數用就行了。
閉包:
內建函式包含對外部範圍而非全域範圍名字的引用,該內建函式稱為閉包函數。
def func(): name = ‘eva‘ def inner(): print(name) return innerf = func()f()
閉包函數常見用法
#輸出的__closure__有cell元素 :是閉包函數def func(): name = ‘eva‘ def inner(): print(name) print(inner.__closure__) return innerf = func()f()#輸出的__closure__為None :不是閉包函數name = ‘egon‘def func2(): def inner(): print(name) print(inner.__closure__) return innerf2 = func2()f2()
判斷是否是閉包
def wrapper(): money = 1000 def func(): name = ‘eva‘ def inner(): print(name,money) return inner return funcf = wrapper()i = f()i()
閉包嵌套
from urllib.request import urlopendef index(): url = "http://www.cnblogs.com/Eva-J/articles/7156261.html" def get(): return urlopen(url).read() return getxiaohua = index()content = xiaohua()print(content)
用閉包擷取網頁內容
閉包引出下一課,裝飾器。。。。。。
總結:
略
Python學習:函數進階