在計算機程序的開發過程中,隨着程序代碼越寫越多,在一個文件裏代碼就會越來越長,越來越不容易維護。
爲了編寫可維護的代碼,我們把很多函數分組,分別放到不同的文件裏,這樣,每個文件包含的代碼就相對較少,很多編程語言都採用這種組織代碼的方式。在Python中,一個.py文件就稱之爲一個模塊(Module)。
先給大家解釋一下模塊、包、庫之間的概念:
-
模塊(module)其實就是 py 文件,裏面定義了一些函數、類、變量等
-
包(package)是多個模塊的聚合體形成的文件夾,裏面可以是多個 py 文件,也可以嵌套文件夾
-
庫是參考其他編程語言的說法,是指完成一定功能的代碼集合,在 Python 中的形式就是模塊和包
下面我們來分開介紹:模塊
使用模塊有什麼好處?
最大的好處是大大提高了代碼的可維護性。其次,編寫代碼不必從零開始。當一個模塊編寫完畢,就可以被其他地方引用。我們在編寫程序的時候,也經常引用其他模塊,包括Python內置的模塊和來自第三方的模塊。
使用模塊還可以避免函數名和變量名衝突。相同名字的函數和變量完全可以分別存在不同的模塊中,因此,我們自己在編寫模塊時,不必考慮名字會與其他模塊衝突。但是也要注意,儘量不要與內置函數名字衝突
定義和調用 Python 模塊
下面先來看真實的定義一個 Python 模塊。
定義一個 hello.py 模塊,內容如下:
def sayhello( ):
print("Hello 學長!")
一般情況下,我們使用 import 語句來引入模塊:
import module1[, module2[,... moduleN]]
當解釋器遇到 import 語句,如果模塊在當前的搜索路徑就會被導入。調用的時候使用 模塊名.函數名
來進行調用
以上的示例爲例,我們新建 do.py 文件調用 hello.py 模塊中方法。
do.py 文件內容如下:
# 導入模塊
import hello
# 現在可以調用模塊裏包含的函數了
hello.sayhello()
在 do.py 頁面執行快捷鍵 ctrl+b (sumblime中)
控制檯輸出:Hello 學長!,證明調用 hello.py 中的方法成功。
再來說“包”
你也許還想到,如果不同的人編寫的模塊名相同怎麼辦?爲了避免模塊名衝突,Python又引入了按目錄來組織模塊的方法,稱爲包(Package)。
舉個例子,一個abc.py
的文件就是一個名字叫abc
的模塊,一個xyz.py
的文件就是一個名字叫xyz
的模塊。
現在,假設我們的abc
和xyz
這兩個模塊名字與其他模塊衝突了,於是我們可以通過包來組織模塊,避免衝突。方法是選擇一個頂層包名,比如mycompany
,按照如下目錄存放:
mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py
包(package)是 Python 中對模塊的更高一級的抽象。
簡單來說,Python 允許用戶把目錄當成模塊看待。這樣一來,目錄中的不同模塊文件,就變成了「包」裏面的子模塊。此外,包目錄下還可以有子目錄,這些子目錄也可以是 Python 包。這種分層,對模塊識別、管理,都是非常有好處的。
特別地,對於一些大型 Python 工具包,內裏可能有成百上千個不同功能的模塊。科學計算領域,SciPy, NumPy, Matplotlib 等第三方工具,都是用包的形式發佈的。
包定義
常見的包層級目錄結構如下:
pakageName
-------__init__.py
-------moduleName1.py
-------moduleName2.py
------- ...
包路徑下必須存在 __init__.py
文件。
使用 Python 包
Python 包的使用和模塊的使用類似,下面是導入的語法:
import 包名.包名.模塊名
總結
本節給大家介紹了 Python 模塊和包的使用,模塊是一組Python代碼的集合,可以使用其他模塊,也可以被其他模塊使用。創建自己的模塊時,要注意:
-
模塊名要遵循Python變量命名規範,不要使用中文、特殊字符;
-
模塊名不要和系統模塊名衝突,最好先查看系統是否已存在該模塊,
檢查方法是在Python交互環境執行import abc,若成功則說明系統存在此模塊。
參考:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017454145014176
https://www.python.org/