Python 名稱空間
Namespaces and Scope: multiple namespaces
物件和名稱的歸屬--Search closure enclosing
Local_Global_built-in
內建名字空間,任何模組均可訪問它,它存放著內建的函式和異常。
全域性名字空間,它記錄了模組的變數,包括函式、類、其它匯入的模組、模組級的變數和常量。 global宣告 是對整個環境下的變數起作用
閉包: 閉包通常與函式相關聯
區域性名字空間,它記錄了函式的變數,包括函式的引數和區域性定義的變數
1. the local space
locals()是Python中一個非常有用的內建函式,尤其是在除錯和檢查當前作用域的區域性變數
locals()函式不需要任何引數,並且返回當前區域性變數作用域的內容
2 Enclosed(閉包作用域):閉包中外部函式定義的變數,但非全域性變數
Enclosed 由閉包函式和其外部函式共同建立的一個作用域
閉包(Closure)
閉包是由一個函式以及建立該函式時的作用域中變數的引用環境共同組成的
建立閉包--使用閉包
內層函式不僅可以訪問,還要可以修改外層函式的變數,那麼需要用到 nonlocal宣告
nonlocal 關鍵字是定義在閉包裡面的
d.__closure__
閉包的__closure__方法,可以檢視每個cell物件的內容。
for i in d.__closure__:
print(i.cell_contents)
cell_contents 解釋了區域性變數在脫離函式後仍然可以在函式之外被訪問的原因,
因為變數被儲存在cell_contents中了
3. globals() 以及 dir() # 獲得當前模組的屬性列表
Modules are Python files, and they contain objects such as functions that can be imported and used by other programs
__dict__ This dictionary is the namespace for the module.
__name__
當 Python 檔案作為一個獨立指令碼執行時,__name__ 被設定為 "__main__",而在被其他模組匯入時,__name__ 被設定為該模組的名稱
__file__
是一個儲存著當前模組所在檔名的全路徑的字串變數,用於獲取當前指令碼的絕對路徑
dir()帶引數時,返回引數的屬性、方法列表
4.built-ins 預設匯入 has a dict attribute
two default modules without requiring an import: the module main and the module builtins .
builtins.py 模組,是python的內建模組,在執行時會自動匯入該模組。在該模組中定義了很多我們常用的內建函式,比如print,input 等。
builtins是一個內建模組,它在Python直譯器啟動時自動載入,幷包含了一組Python的內建函式、異常和常量
Python 的內建模組通常被編譯到 Python 直譯器-builtins.py看起來只包含了空函式定義
實際上是透過Python的C API介面呼叫C語言實現的底層函式
直譯器實現的,它們的具體實現通常是用C語言編寫 __builtins__.__dict__ 約有151個函式和變數
moduleSpec
class
built-in function
Ellipsis 物件: 在python程式碼中通常寫作 … ,
Exception TypeError
閉包的應用場景
閉包的應用場景
1.資料封裝和隱私:
閉包可以用來封裝資料,透過內部函式來訪問這些資料,而外部程式碼無法直接訪問。這增加了資料的安全性。
把一些變數隱藏到函式內部,作為區域性變數。但是由於Python中作用域的搜尋順序,函式內的變數不會被函式外的程式碼讀取到。
想要函式外部的程式碼能夠讀取函式內部的變數,那麼就可以使用閉包,函式內部再定義一個函式,這樣就可以引用到外層變數
區域性變數無法共享和長久的儲存,而全域性變數可能造成變數汙染,閉包既可以長久的儲存變數又不會造成全域性汙染。
物件導向: 這方面--“讀取函式內部的變數”和“讓函式內部的區域性變數始終保持在記憶體中”,都可以被 Python 中現成的物件“類”很好地實現
2.函式工廠:
閉包可以用來建立具有特定行為或狀態的函式物件。這些函式物件可以根據需要定製。
3.裝飾器:
Python中的裝飾器本質上就是閉包的一種應用。裝飾器接收一個函式作為引數,並返回一個新的函式,這個新函式在某種條件下會呼叫原函式。
透過閉包,裝飾器可以記住額外的狀態資訊,並在被裝飾的函式執行時使用這些資訊。
內建裝飾器: @classmethod @staticmethod @property
自定義裝飾器(無參) @functools.wraps(func)
絕大多數裝飾器都是基於函式和 閉包 實現的
物件導向設計(Object-Oriented Design,OOD):Python 對某個物件是否能透過裝飾器( @decorator)形式使用只有一個要求:
decorator 必須是一個“可被呼叫(callable)的物件
函式自然是“可被呼叫”的物件。但除了函式外,我們也可以讓任何一個類(class)變得“可被呼叫”(callable)。
只要自定義類的 __call__ 魔法方法即可
4.延遲計算:
閉包可以用來實現惰性求值(Lazy Evaluation),即只有在需要的時候才進行計算
函式
列表推導式 迭代式 生成器 裝飾器
zip()
zip函式用於將可迭代的物件作為引數,將物件中對應的元素打包成一個個元組,然後返回由這些元組組成的迭代器
裝飾器的背後--是語言開發模式的設計,應用者先使用,再去探索這之後的原因,而使用前的有限信任和有限開始,是行動的一種重要方式
python
Python中,註解(Annotations)是一種為變數、函式引數、函式返回值等新增元資訊的方式
-> 型別提示(Type Hints)
裝飾器註解
**三、上下文管理器註解**
簡化類定義 避免手動編寫大量的樣板程式碼 自動生成方法 提高開發效率
Java 註解(Anno
註解並不直接影響程式碼的語義,但卻能被某些工具軟體(如編譯器、框架)所讀取和利用
編譯檢查 - 如@Override放在方法前,如果該方法不是重寫父類的方法,則編譯器會發出警告
生成額外的檔案 - 如Javadoc工具會根據原始碼中的註解來生成API文件
編譯時動態處理-在編譯時讀取註解的資訊,然後根據註解的資訊進行一些其他處理
註解的宣告 和使用 用於註解其他註解的註解稱為元註解
內建註解 @Override @Deprecated
參考
【python】Python中閉包的是什麼,閉包原理分析與應用實戰 https://blog.csdn.net/littlefun591/article/details/140492786
The Practice of Computing Using Python, 2nd International Edition