day 12 名稱空間和閉包函式
函式巢狀
按照函式的兩個階段分為:
巢狀呼叫:在一個函式內部呼叫另一個函式
巢狀定義:在一個函式內部定義另一個函式
名稱空間(namespace):儲存名字的記憶體區域
名稱空間的分類:
內建名稱空間:存的是直譯器自帶的名稱
全域性名稱空間:只要是頂著最左邊寫的,沒有任何縮排,就在全域性名稱空間中
注意在if中如果if是頂著最左邊的沒有縮排,那麼if裡面的名字也在全域性名稱空間中,while,for with同樣如此
區域性名稱空間:存的是函式內定義的名字
名稱空間的載入順序
內建 --> 全域性 --> 區域性
名字的查詢順序
區域性 --> 全域性 --> 內建
作用域
指的是名字生效的有效空間
儲存名字的有三個地方
內建名稱空間
全域性名稱空間
區域性名稱空間
全域性作用域:
內建空間和全域性空間都是同一個範圍,都是全域性作用域
區域性作用域:
區域性名稱空間歸為區域性作用域
global(全域性) 與nonlocal(不使用本地)關鍵字
global
當需要在函式內修改全域性中名字的值需要使用global
注:必須在使用這個名字之前宣告(global)
nonlocal
當需要在內層函式中修改外層函式中的名字的時候就使用nonlocal關鍵字
會一層一層往外層查詢,直到找到了為止,不會尋找到全域性作用中,最後一層函式中沒有找到就會報錯
函式物件
函式是第一物件
1.能夠被呼叫
2.可以當做容器型別的元素
3.可以當做函式的引數
4.可以當做函式的返回值
函式名除了可以呼叫之外,其他的都與一個變數名沒喲本質區別
閉包函式:
閉包函式:就是在一個函式定義另一個函式
閉包函式也是一種函式
特點是:
1.該函式是定義在另一個函式中
2.該函式包含了對外層函式中名字的引用,滿足以上兩條就是閉包函式
注意:名字所在的作用域,在函式定義階段就已經固定了