函式的高階

2022-08-23 23:06:12 字數 1542 閱讀 7833

目錄命名空間

在python直譯器開始執行之後, 就會在記憶體中開闢乙個空間, 每當遇到乙個變量的時候, 就把變量名和值之間的關係記錄下來, 但是當遇到函式定義的時候, 直譯器只是把函式名讀入記憶體, 表示這個函式存在了, 至於函式內部的變量和邏輯, 直譯器是不關心的. 也就是說一開始的時候函式只是載入進來, 僅此而已, 只有當函式被呼叫和訪問的時候, 直譯器才會根據函式內部宣告的變量來進行開闢變量的內部空間. 隨著函式執行完畢, 這些函式內部變量占用的空間也會隨著函式執行完畢而被清空。

我們首先回憶一下python**執行的時候遇到函式是怎麼做的,從python直譯器開始執行之後,就在記憶體中開闢裡乙個空間,每當遇到乙個變數的時候,就把變數名和值之間對應的關係記錄下來,但是當遇到函式定義的時候,直譯器只是象徵性的將函式名讀如記憶體,表示知道這個函式存在了,至於函式內部的變數和邏輯,直譯器根本不關心。等執行到函式呼叫的時候,python直譯器會再開闢一塊記憶體來儲存這個函式裡面的內容,這個時候,才關注函式裡面有哪些變數,而函式中的變數回儲存在新開闢出來的記憶體中,函式中的變數只能在函式內部使用,並且會隨著函式執行完畢,這塊記憶體中的所有內容也會被清空。

我們給這個『存放名字與值的關係』的空間起了乙個名字-------命名空間。

**在執行伊始,建立的儲存「變數名與值的關係」的空間叫做全域性命名空間;

在函式的執行中開闢的臨時的空間叫做區域性命名空間也叫做臨時命名空間。

現在我們知道了,py檔案中,存放變數與值的關係的乙個空間叫做全域性命名空間,而當執行乙個函式時,記憶體中會臨時開闢乙個空間,臨時存放函式中的變數與值的關係,這個叫做臨時命名空間,或者區域性命名空間。

其實python還有乙個空間叫做內建命名空間:內建命名空間存放的就是一些內建函式等拿來即用的特殊的變數:input,print,list等等

命名空間

全域性命名空間---我們寫的**但不是函式中的**

區域性命名空間

載入順序

所謂的載入順序,就是這三個空間載入到記憶體的先後順序,也就是這個三個空間在記憶體中建立的先後順序,你想想他們能是同時建立麼?肯定不是的,那麼誰先誰後呢?我們捋順一下:在啟動python直譯器之後,即使沒有建立任何的變數或者函式,還是會有一些函式直接可以用的比如abs(-1),max(1,3)等等,在啟動python直譯器的時候,就已經匯入到記憶體當中供我們使用,所以肯定是先載入內建命名空間,然後就開始從檔案的最上面向下一行一行執行,此時如果遇到了初始化變數,就會建立全域性命名空間,將這些對應關係存放進去,然後遇到了函式執行時,在記憶體中臨時開闢乙個空間,載入函式中的一些變數等等。所以這三個空間的載入順序為:內建命名空間(程式執行伊始載入)->全域性命名空間(程式執行中:從上到下載入)->區域性命名空間(程式執行中:呼叫時才載入。

取值順序

取值順序就是引用乙個變數,先從哪乙個空間開始引用。這個有乙個關鍵點:從哪個空間開始引用這個變數。

所以空間的取值順序與載入順序是相反的,取值順序滿足的就近原則,從小範圍到大範圍一層一層的逐步引用。

作用域函式名的本質

函式名就是乙個變數,具有變數的功能。可以被賦值;但是作為函式名它也有特殊的功能就是加上()就會執行對應的函式,所以我們可以把函式名當作乙個特殊的變數。
閉包

函式的高階

def func a1,a2,a3 print a1,a2,a3 func 1,3,4 a1 1,a2 3,a3 4def func a1,a2 print a1,a2 func a2 99,a1 2 關鍵字傳引數和位置傳參可以混合使用 位置傳入的引數 關鍵字引數在後 總引數個數 def func1...

函式的高階

函式高階 動態引數 形參 位置引數 動態位置引數 預設引數 動態預設引數 實參 位置引數 動態位置引數 關鍵字引數 動態關鍵字引數 函式的注釋 作用域 全域性作用域 內建 全域性 全域性作用域 區域性作用域 函式內的就是區域性作用域 函式的巢狀 global nonlocal global 在區域性...

函式的高階

一 函式引數 動態傳參 1 動態的接收位置引數 引數位置編寫 表示接收任意內容,有多個引數傳進去,收到的內容是元組tuple def func food print food func 面 公尺飯 麵包 饅頭 先位置引數,後動態引數 def chi a,b,food print a,b,food c...