Python 提供了強大的模塊支持,主要體現在,不僅 Python 標准庫中包含了大量的模塊(稱為標准模塊),還有大量的第三方模塊,開發者自己也可以開發自定義模塊。
通過這些強大的模塊可以極大地提高開發者的開發效率。
一、模塊的概念
模塊,英文為 Modules,是 Python 程序架構的一個核心概念。
至於模塊到底是什么,可以用一句話總結:模塊就是 Python 程序,每一個以擴展名 py 結尾的 Python 源代碼文件都是一個模塊。
換句話說,任何 Python 程序都可以作為模塊。
模塊可以比作一盒積木,通過它可以拼出多種主題的玩具,這與函數不同,一個函數僅相當於一塊積木,而一個模塊中可以包含多個函數,也就是很多積木。
模塊名同樣也是一個標識符,需要符合標識符的命名規則。
在模塊中定義的全局變量、函數、類都是提供給外界直接使用的工具。
模塊就好比是工具包,要想使用這個工具包中的工具,就需要先導入這個模塊。
二、模塊的導入方式
1、import 導入
import 模塊名1, 模塊名2
導入之后,通過 模塊名. 的方式使用模塊提供的工具 —— 全局變量、函數、類。
使用 as 指定模塊的別名
如果模塊的名字太長,可以使用 as 指定模塊的名稱,以方便在代碼中的使用。
import 模塊名1 as 模塊別名
注意:模塊別名應該符合大駝峰命名法。
2、from...import 導入
如果希望從某一個模塊中,導入部分工具,就可以使用 from ... import 的方式。
import 模塊名是一次性把模塊中所有工具全部導入,並且通過 模塊名/別名 訪問。
# 從 模塊 導入 某一個工具
from 模塊名1 import 工具名
導入之后,不需要通過 模塊名. 的方式來調用工具,可以直接使用模塊提供的工具 —— 全局變量、函數、類。
如果兩個模塊,存在同名的函數,那么后導入模塊的函數,會覆蓋掉先導入的函數。
在開發時, import 代碼應該統一寫在代碼的頂部,這樣可以更容易地及時發現沖突。一旦發現沖突,可以使用 as 關鍵字給其中一個工具起一個別名。
import 導入所有工具
# 從 模塊 導入 所有工具
from 模塊名1 import *
不過,這種方式不推薦使用,因為函數重名並沒有任何的提示,出現問題不好排查。
3、模塊的搜索順序
Python 的解釋器在導入模塊時,會:
搜索當前目錄指定模塊名的文件,如果有就直接導入,
如果沒有,再搜索系統目錄。
在開發時,給文件起名,不要和系統的模塊文件重名。
示例:
import random
# 生成一個 0~10 的數字
rand = random.randint(0, 10)
print(rand)
上面的代碼,如果在當前目錄下,存在一個 random.py 的文件,程序就無法正常執行了!
這個時候,Python 的解釋器會加載當前目錄下的 random.py 而不會加載系統的 random 模塊。
Python 中每一個模塊都有一個內置屬性 __file__ 可以查看模塊的完整路徑。
import random
print(random.__file__)
# D:\python\lib\random.py
4、原則 —— 每一個文件都應該是可以被導入的
一個獨立的 Python 文件就是一個模塊,在導入文件時,文件中所有沒有任何縮進的代碼都會被執行一遍!
在實際開發中,每一個模塊都是獨立開發的,大多都有專人負責。開發人員通常會在模塊下方增加一些測試代碼,僅在模塊內使用,而被導入到其他文件中不需要執行。
在 Python 中有一個 __name__ 屬性,__name__ 屬性可以做到,測試模塊的代碼只在測試情況下被運行,而在被導入時不會被執行!
__name__ 是 Python 的一個內置屬性,記錄着一個字符串。
如果是被其他文件導入並執行的,那么__name__ 就是模塊名,
如果是直接執行當前程序,那么 __name__ 是 '__main__'。
所以在很多 Python 文件中都會看到以下格式的代碼:
# 導入模塊
# 定義全局變量
# 定義類
# 定義函數
# 在代碼的最下方
def main():
# ...
pass
# 根據 __name__ 判斷是否執行下方代碼
if __name__ == "__main__":
main()
三、模塊的價值
經過之前的學習,我們已經能夠將 Python 代碼寫到一個文件中。
但隨着程序功能的復雜,程序體積會不斷變大,為了便於維護,通常會將其分為多個文件(模塊),這樣不僅可以提高代碼的可維護性,還可以提高代碼的可重用性。
代碼的可重用性體現在,當編寫好一個模塊后,只要編程過程中需要用到該模塊中的某個功能(由變量、函數、類實現),無需做重復性的編寫工作,直接在程序中導入該模塊即可使用該功能。
之前學習過面向對象的封裝,並且還介紹了很多具有封裝特性的結構,比如說:
諸多容器,例如列表、元組、字符串、字典等,它們都是對數據的封裝。
函數是對 Python 代碼的封裝。
類是對方法和屬性的封裝,也可以說是對函數和數據的封裝。
而這里的模塊,可以理解為是對代碼更高級的封裝,即把能夠實現某一特定功能的代碼編寫在同一個 .py 文件中,並將其作為一個獨立的模塊。
這樣既可以方便其它程序或腳本導入並使用,同時還能有效避免函數名和變量名發生沖突。