模組、包、庫前置知識
2.1 模組、包、庫前置知識
這一章節我們來了解下Python程式設計中經常遇到的模組、包、庫及虛擬環境。在開始學習之前我們需要了解一些前置知識。
2.1.1 Python指令碼檔案型別
Python程式設計中編寫的指令碼通常是以檔案形式儲存在磁碟中的。其中常見的指令碼檔案型別如下:
檔案型別 | 檔案說明 |
---|---|
.py |
原始檔 |
.pyc |
原始檔編譯後的檔案 |
.pyo |
原始檔優化編譯後的檔案 |
.pyd |
其他語言寫的Python庫 |
Python在執行時會先將原始碼py檔案編譯成pyc或者pyo,然後由Python的虛擬機器執行,相對於py檔案來說,編譯成pyc或pyo本質上和py沒有太大的區別,只是對於這個檔案的載入速度提高了,但是不會提高程式碼的執行速度。
2.1.2 環境變數
我們可以粗略的將環境變數理解為路徑包。當程式需要查詢指定的檔案時,就會在相應的環境變數指定的路徑包中按照順序查詢。如果全部查詢完畢後仍然沒有找到,那麼就回會報錯。
環境變數有兩種型別:1、系統環境變數
系統環境變數,顧名思義,就是系統級別的。也就是說一旦配置了系統環境變數後,只要是使用這個作業系統的使用者,不管任何使用者都能通過這個環境變數直接找到相應的路徑。2、使用者環境變數
使用者環境變數,顧名思義,是獨屬於某個使用者的,其它使用者不能使用或者使用時指向的路徑包不一樣。
Python程式設計中最重要的環境變數就是PYTHONPATH
。當在執行Python程式時如果遇到找不到路徑的時候就可以嘗試在這個環境變數中新增。具體的新增路徑方式如下:
1、先開啟環境變數編輯視窗,可以通過在搜尋框中搜索關鍵字環境變數
此電腦
,在彈出的選單欄中點選屬性
,然後再點選左邊的高階系統設定
。在彈出的系統屬性
視窗中切換到高階
選項卡,點選下方的環境變數
即可。2、拖動下方的系統變數
下拉滾動條,找到PYTHONPATH
,點選編輯即可對該條系統變數進行編輯。如果沒有該條目,則可以點選新建
以建立。
練習
隨意新建一個資料夾並將該資料夾地址新增到Python搜尋路徑中。
2.1.3 Python搜尋路徑
一般Python在執行時會按照一定的順序在搜尋路徑下查詢對應的包或者模組。如果沒有找到則會報錯。Python搜尋路徑存放在sys模組下的path中。是以一個列表形式儲存。使用下面的程式碼可以檢視到本機Python的搜尋路徑:
import sys
import pprint
pprint.pprint(sys.path)
筆者電腦的查詢結果如下:
['E:\studypy',
'E:\studypy',
'E:\studypy\source',
'E:\FrbPythonFiles\Scripts', 'D:\Soft_Installed\PyCharm_2021.3.3_pro\plugins\Python\helpers\pycharm_display',
'C:\Program Files\Python3102\Python310.zip',
'C:\Program Files\Python3102\DLLs',
'C:\Program Files\Python3102\lib',
'C:\Program Files\Python3102',
'C:\Users\思必得\AppData\Roaming\Python\Python310\site-packages',
'C:\Program Files\Python3102\lib\site-packages',
'C:\Program Files\Python3102\lib\site-packages\win32',
'C:\Program Files\Python3102\lib\site-packages\win32\lib',
'C:\Program Files\Python3102\lib\site-packages\Pythonwin',
'D:\Soft_Installed\PyCharm_2021.3.3_pro\plugins\Python\helpers\pycharm_matplotlib_backend']下面對查詢的結果進行說明:
第1行:本py檔案所在的目錄路徑
(第2行):在Pycharm中執行py檔案,則為專案結構中根
指定的目錄路徑
(第3行):在Pycharm中執行py檔案,則為專案結構中原始檔夾
指定的目錄路徑
(第4行):為在系統環境變數PYTHONPATH中指定的路徑
(第5行):在Pycharm中執行py檔案,則為PyCharm軟體的指定所示路徑。
第6行-第14行為當前Python直譯器相關路徑。
打印出來的每個字串都表示一個位置,如果要讓直譯器能夠找到模組,可將其放在其中任何一個位置中。雖然放在這裡顯示的任何一個位置中都可行,但目錄site-packages
是最佳的選擇,因為它就是專門用來放置第三方模組
的。(這個之後會介紹)
不過有時候將模組放在正確的位置可能不是合適的解決方案,其中的原因很多。
- 不希望Python直譯器的目錄中充斥著你編寫的模組。
- 沒有必要的許可權,無法將檔案儲存到Python直譯器的目錄中。
- 想將模組放在其他地方。
最重要的是,如果將模組放在其他地方,就必須告訴直譯器到哪裡去查詢。方法一:修改sys.path
直接修改sys.path(使用append方法)。這個方法修改後的搜尋路徑並不是永久性的。方法二:修改PYTHONPATH環境變數
將模組所在的位置新增到系統環境變數中PYTHONPAT中。這個方法是永久性的。重啟電腦後依舊生效。不過要記得重啟PyCharm。練習
通過互動模式檢視電腦上的Python搜尋路徑。
2.1.4 名稱空間
2.1.4.1 名稱空間的概念
Python使用叫做名稱空間的東西來記錄變數的軌跡。名稱空間實際上是一個字典,它的鍵
就是變數名,它的值
就是那些變數的值。
在一個 Python程式中的任何一個地方,都存在幾個可用的名稱空間。
1、每個函式
都有著自已的名稱空間,叫做區域性名稱空間
,它記錄了函式的變數,包括函式的引數和區域性定義的變數。
2、每個模組
擁有它自己的名稱空間,叫做全域性名稱空間,它記錄了模組的變數,包括函式、類、其它匯入的模組、模組級的變數和常量。
3、還有就是內建名稱空間,任何模組均可訪問它,它存放著內建的函式和異常。
2.1.4.2 作用域的概念
是指Python程式可以直接訪問到的名稱空間。直接訪問
意味著訪問名稱空間中的命名時不需要加入附加的修飾符。
2.1.4.3 名稱空間查詢順序
-
區域性名稱空間
:特指當前函式或類的方法。 -
全域性名稱空間
:特指當前的模組。 -
內建名稱空間
:Python在執行時自動載入的函式或者變數(builtins)。
當一行程式碼要使用變數 x 的值時,Python會到所有可用的名稱空間去查詢變數,查詢的順序為:區域性名稱空間
→全域性名稱空間
→內建名稱空間
如果 Python在這些名稱空間找不到 x,它將放棄查詢並引發一個 NameError 異常:NameError: name 'x' is not defined。
如果存在巢狀函式,則會在當前函式的名稱空間中搜索不到時,依次在父函式並一層層往上繼續搜尋,如果所有的祖上函式都搜尋不到時,再開始到
全域性名稱空間
中搜索。
2.1.4.4 名稱空間的生命週期
不同的名稱空間在不同的時刻建立,有不同的生存期。
1、內建名稱空間在 Python直譯器啟動時建立,會一直保留,不被刪除。
2、模組的全域性名稱空間在模組定義被讀入時建立,通常模組名稱空間也會一直儲存到直譯器退出。
3、當函式被呼叫時建立一個區域性名稱空間,當函式返回結果或丟擲異常時,被刪除。每一個遞迴呼叫的函式都擁有自己的名稱空間。
Python的一個特別之處在於其賦值操作總是在最裡層的作用域。賦值不會複製資料而只是將命名繫結到物件。刪除也是如此:del y
只是從區域性作用域的名稱空間中刪除命名 y 。事實上,所有引入新命名的操作都作用於區域性作用域。
2.1.4.5 名稱空間的訪問
函式locals()
返回一個字典。這個字典存放了所有的區域性名稱空間變數。
函式globals()
返回一個字典。這個字典存放了所有的全域性名稱空間變數。
可以通過修改名稱空間字典的方式從而直接修改名稱空間中的變數,比如增加變數、修改變數的值、刪除變數等。練習
1、檢視__builtins__
中的所有物件。
2、通過locals
和globals
函式檢視區域性名稱空間和全域性名稱空間變數。