函式物件、名稱空間和作用域
阿新 • • 發佈:2020-09-14
一、函式物件
函式的名字就是函式物件,它在python中是第一類物件,函式名指向的是函式的記憶體地址。
1.1 函式物件的作用:
1、函式名可以被引用
def bar(): print('from bar') f=bar f()
2、函式名可以當作引數傳入
def bar(): print('from bar) def wrapper(func): #func=bar func() wrapper(bar)
3、可以當函式的返回值
def bar(): print('from bar') def foo(func): return func#print(bar) f = foo(bar) # f ---> bar #print(f) f()
4、函式名可以作為容器型別的元素
def get(): print('from get') def put(): print('from put') l = [get,put] #print(l) l[0]()
1.2 函式物件的應用
可以優雅地取代if分支
二、函式巢狀
作用:讓內層函式封閉起來,不讓外部直接呼叫
2.1 函式的巢狀呼叫:
在函式內又呼叫其他函式,將複雜並且小的功能,在函式內部呼叫,解決程式碼結構清晰問題
def max1(x,y):if x > y: return x else: return y def max2(x,y,z): res1 = max1(x,y) res2 = max1(res1,z) return res2 print(max2(11,199,2))
2.2 函式的巢狀定義:
例1: def func1(): print('from func1') def func2(): print('from func2') func2() func1()
三、名稱空間
名稱空間:存放名字與值繫結關係的地方,如果你想訪問一個變數值,必須要先訪問對應的名稱空間
名稱空間的分類:
內建名稱空間:存放python直譯器自帶的名字。
在啟動python直譯器時就生效,關閉就失效
全域性名稱空間:檔案級別(頂頭寫的名字)的名字。
在執行檔案時生效,在檔案結束或者在檔案執行期間被刪除的就失效
def func(): #func是全域性的 pass if 10>3: y =333 #y 是全域性的
區域性名稱空間:存放函式內定義的名字(函式的引數以及函式內的名字都存放於區域性記憶體空間)。
在呼叫當前函式時臨時生效,函式體程式碼執行結束時失效。
載入順序:內建名稱空間 -->>全域性名稱空間-->>區域性名稱空間
名稱空間的查詢順序:區域性名稱空間-->>全域性名稱空間-->>內建名稱空間
len = 'global' def f1(): # len = 1 def f2(): # len = 2 print(len) len = 1 f2() f1()
四、作用域
作用域:名稱空間發揮作用的範圍
作用域的分類:
1、全域性作用域:包含的是內建名稱空間與全域性名稱空間的名字
特點: 只要程式一直執行,永久存活,若程式結束,則銷燬
2、區域性作用域:包含的是區域性名稱空間的名字
特點:只能在函式內使用,呼叫函式時生效,呼叫結束失效
補充:
1、global:宣告全域性變數
def index(): global x #宣告X是全域性變數 x=2 print(x) index() print(x)
2、nonlocal:在區域性名稱空間宣告區域性變數,在區域性修改外部(上層函式)的變數
def index(): x=1 def func(): nonlocal x x=2 func() print(x) index()