模塊(module):包含python語句的文件
模塊的文件名:模塊名.py
變量__name__的值記錄了一個模塊的文件名
1. 導(dǎo)入模塊
? ? 假設(shè)有一個模塊,文件名是demo.py, 該模塊定義了兩個函數(shù),func1 和 func2
? ? 導(dǎo)入模塊有以下幾種常見的形式:
? ? (1)import demo
? ? ? ? ? ? 調(diào)用模塊中的函數(shù)就可以用 demo.func1(), demo.func2()
? ? (2)import demo as d
? ? ? ? ? ? 這種方法導(dǎo)入模塊的同時,用as 關(guān)鍵字給模塊取了一個別名,方便后續(xù)的使用,這種情況下調(diào)用該模塊下的函數(shù)就變?yōu)椋篸.func1(), d.func2()
? ? (3)from demo import func1, func2
? ? ? ? ????從demo模塊中導(dǎo)入其中的兩個函數(shù),func1 和 func2。這種方法多用于一個模塊下有多個函數(shù)以及類等,這些就可以把所需要用的函數(shù)給導(dǎo)入進(jìn)去就可以,此時函數(shù)的調(diào)用也更加簡單了,不用再加所在模塊的模塊名了,例如: func1(), func2()
? ? (4)from demo import *
? ? ? ? ? ? 把demo模塊下的所有非下劃線‘_'開頭的名稱都導(dǎo)入進(jìn)去,這樣寫會使代碼書寫比較方便,但一般不建議這樣寫,因為不知道都導(dǎo)入了哪些內(nèi)容,不利于代碼閱讀。此時函數(shù)調(diào)用如上,可以直接 func1()
2. 以腳本方式執(zhí)行模塊
? ? 除了像上面那樣導(dǎo)入模塊,還可以以腳本方式執(zhí)行模塊,例如:
? ? python demo.py 參數(shù)
? ? 執(zhí)行模塊的時候, 該模塊的 __name__ 會被賦值為 “__main__”. 這就需要你在模塊的末尾添加:
? ? ? ? if __name__ == "__main__":
? ? ? ? ? ? ? ? func1(參數(shù))
? ? 這樣就可以把模塊以腳本的方式來執(zhí)行,在這種情況下,import demo是不會執(zhí)行該腳本的
3. 模塊的搜索路徑
? ? 當(dāng)一個模塊(如 demo)被導(dǎo)入的時候,解釋器先會在內(nèi)置模塊中搜索該模塊,如果沒有找到就會從sys.path 定義的目錄列表中去搜索(包括 腳本目錄, pythonpath, 以及安裝時的默認(rèn)設(shè)置)
4. 模塊的編譯
? ? 為了加速python文件的載入速度,每個py文件編譯后的版本會放置在一個名為__pycache__的緩存目錄中,編譯后的模塊的文件名是 module.version.pyc
? ? 編譯后的模塊可以在各平臺上運行
? ? python在兩種情況下不會檢查編譯緩存:(1)命令行直接導(dǎo)入的代碼(2)沒有源文件,無源文件的發(fā)行版
? ? 編譯后的模塊并不比未編譯的讀取速度更快,影響的只是文件的加載速度
5. 標(biāo)準(zhǔn)模塊
? ? python有自己的標(biāo)準(zhǔn)模塊庫,以提高執(zhí)行效率,有些模塊取決于平臺,如winreg模塊就只在windows平臺上提供,sys 模塊嵌入到每一個解釋器中,sys.ps1 和 sys.ps2 分別定義了初級和次級提示字符,默認(rèn)為 >>> 和 ... , sys.path 定義了模塊的搜索路徑。
6. dir() 函數(shù)
? ? 列出模塊所有定義的名稱,返回一個排序后的字符串列表,如:
?????????dir(demo),?
????????返回 [ '__name__', 'func1', 'func2' ]
? ? 如果 dir() 函數(shù)沒有傳遞參數(shù),就會返回當(dāng)前所有定義的名稱
? ? import builtins
? ? dir(buildtins) 會返回python內(nèi)置的函數(shù)和變量名
? ??
7. 包 (package)
? ? 包是python中一種構(gòu)造模塊命名空間的方法,通過包名.模塊名來調(diào)用模塊,這樣做的好處是使不同模塊的作者不用擔(dān)心模塊名稱一樣,導(dǎo)入方法和上述導(dǎo)入模塊的方法類似
? ? 當(dāng)一個包下還有子包時, 子包之間可通過絕對路徑來導(dǎo)入,也可通過相對路徑來導(dǎo)入兄弟包中的函數(shù)等
? ??