函數對象、函數嵌套、名稱空間與作用域
阿新 • • 發佈:2018-06-10
pan oca 函數 三種 locals ice 無法 利用 多分支
一、 函數是第一類對象,即函數可以當作數據傳遞
#1 可以被引用 #2 可以當作參數傳遞 #3 返回值可以是函數 #3 可以當作容器類型的元素
二、 利用該特性,優雅的取代多分支的if
def foo(): print(‘foo‘) def bar(): print(‘bar‘) dic={ ‘foo‘:foo, ‘bar‘:bar, } while True: choice=input(‘>>: ‘).strip() if choice in dic: dic[choice]()
三、 函數的嵌套調用
def max(x,y): return x if x > y else y def max4(a,b,c,d): res1=max(a,b) res2=max(res1,c) res3=max(res2,d) return res3 print(max4(1,2,3,4))
四、 函數的嵌套定義
def f1(): def f2(): def f3(): print(‘from f3‘) f3() f2() f1() f3() #報錯,為何?請看下一小節
五、 名稱空間與作用域
(1) 什麽是名稱空間?
#名稱空間:存放名字的地方,三種名稱空間,(之前遺留的問題x=1,1存放於內存中,那名字x存放在哪裏呢?名稱空間正是存放名字x與1綁定關系的地方)
(2)名稱空間的加載順序
#1、python解釋器先啟動,因而首先加載的是:內置名稱空間 #2、執行test.py文件,然後以文件為基礎,加載全局名稱空間 #3、在執行文件的過程中如果調用函數,則臨時產生局部名稱空間
(3)名字的查找順序
局部名稱空間--->全局名稱空間--->內置名稱空間 #需要註意的是:在全局無法查看局部的,在局部可以查看全局的,如下示例 # max=1 def f1(): # max=2 def f2(): # max=3 print(max) f2() f1() print(max)
(4)作用域
#1、作用域即範圍 - 全局範圍(內置名稱空間與全局名稱空間屬於該範圍):全局存活,全局有效 - 局部範圍(局部名稱空間屬於該範圍):臨時存活,局部有效 #2、作用域關系是在函數定義階段就已經固定的,與函數的調用位置無關,如下 x=1 def f1(): def f2(): print(x) return f2 x=100 def f3(func): x=2 func() x=10000 f3(f1()) #3、查看作用域:globals(),locals() LEGB 代表名字查找順序: locals -> enclosing function -> globals -> __builtins__ locals 是函數內的名字空間,包括局部變量和形參 enclosing 外部嵌套函數的名字空間(閉包中常見) globals 全局變量,函數定義所在模塊的名字空間 builtins 內置模塊的名字空間
函數對象、函數嵌套、名稱空間與作用域