1. 程式人生 > >第十天函式進階

第十天函式進階

---恢復內容開始---

一 名稱空間:

  全域性名稱空間:在定義函式和變數的時候會生成一個全域性名稱空間,在程式從上到下被執行的過程中被一次載入進記憶體。

    例如:我們曾經定義過的函式名或變數名稱。

  區域性名稱空間:就是函式內部定義的名稱。在函式呼叫過程中才會被放到記憶體中

  內建名稱空間:python直譯器啟動時就存在於記憶體中的空間。

    例如:print()  list()  input()  等都有內建的名稱空間。

  在區域性:可以使用全域性和內建名稱空間

  在全域性:可以使用內建名稱空間和全域性名稱空間的變數

  即在大空間不能使用小空間裡的變數,但是在小空間裡可以使用大空間裡的變數。

  在內建的名稱空間裡,是不能使用全域性和全域性變數的。

  另外注意:如果定義了和內建函式的自定義函式,自定義函式會覆蓋內建函式。

  多個區域性空間之間各自的變數是不共享的。

 

二 作用域:

  全域性作用域:作用在全域性,包含全域性和內建名稱空間中的名字。

  區域性作用域:作用在區域性,包含函式內的名字。

    注意,對於不可變型別,在區域性可以檢視全域性變數,但是不能直接修改。如果想要修改的話,需要使用global聲名。

    但是儘量不要使用global 聲名,儘量使用傳參和接受引數去在區域性和全域性中傳遞引數。

a = 1
def adda():
global a
a += 1
print(a)
adda()
>>> 2

    以上程式碼意味著,函式使用的是全域性變數,而不是函式內的區域性變數。

  locals() :用於檢視全部的區域性變數。

  globals() :用於檢視全部的全域性變數,甚至包含在區域性中的變數。

  

三 閉包

  在外部函式定義了變數,在內部函式中呼叫了外部函式的變數,就以意味著這個內部函式就是一個閉包函式。

  如果print(函式名.__closure)如果列印了一個cell的結果,那麼這個函式就是一個閉包。

 

  標準格式:

  def outer():

    a = 1

    def inner():

      print(a)

    return inner

  inn = outer()

  inn()

 

  意義:這個時候,雖然a不是一個全域性變數,但是這個變數是會始終存在於記憶體中的。這個變數不會影響全域性變數,又可以隨時使用。

    目前應該還沒有需求點,但是以後對於程式的優化作用是很大的。