教會你所有的Python模塊使用_第1頁
教會你所有的Python模塊使用_第2頁
教會你所有的Python模塊使用_第3頁
教會你所有的Python模塊使用_第4頁
教會你所有的Python模塊使用_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

..看了這篇你就會了所有的python模塊使用如果你退出Python解釋器并重新進入,你做的任何定義〔變量和方法都會丟失。因此,如果你想要編寫一些更大的程序,為準備解釋器輸入使用一個文本編輯器會更好,并以那個文件替代作為輸入執行。這就是傳說中的腳本。隨著你的程序變得越來越長,你可能想要將它分割成幾個更易于維護的文件。你也可能想在不同的程序中使用順手的函數,而不是把代碼在它們之間中拷來拷去。為了滿足這些需要,Python提供了一個方法可以從文件中獲取定義,在腳本或者解釋器的一個交互式實例中使用。這樣的文件被稱為模塊;模塊中的定義可以導入到另一個模塊或主模塊中〔在腳本執行時可以調用的變量集位于最高級,并且處于計算器模式。模塊是包括Python定義和聲明的文件。文件名就是模塊名加上.py后綴。模塊的模塊名〔做為一個字符串可以由全局變量__name__得到。例如,你可以用自己慣用的文件編輯器在當前目錄下創建一個叫fibo.py的文件,錄入如下內容:現在進入Python解釋器并使用以下命令導入這個模塊:這樣做不會直接把fibo中的函數導入當前的語義表;它只是引入了模塊名fibo。你可以通過模塊名按如下方式訪問這個函數:如果打算頻繁使用一個函數,你可以將它賦予一個本地變量:深入模塊除了包含函數定義外,模塊也可以包含可執行語句。這些語句一般用來初始化模塊。他們僅在第一次被導入的地方執行一次。每個模塊都有自己私有的符號表,被模塊內所有的函數定義作為全局符號表使用。因此,模塊的作者可以在模塊內部使用全局變量,而無需擔心它與某個用戶的全局變量意外沖突。從另一個方面講,如果你確切的知道自己在做什么,你可以使用引用模塊函數的表示法訪問模塊的全局變量,modname.itemname。模塊可以導入其他的模塊。一個〔好的習慣是將所有的import語句放在模塊的開始〔或者是腳本,這并非強制。被導入的模塊名會放入當前模塊的全局符號表中。小編為大家推薦一個學習交流群:308754087,群里有人都快滿了~大家遇到啥問題都可以在里面交流!是一個非常好的學習交流地方~欲進從速歐~各種PDF等你來下載,全部免費,只為幫助大家快速入門。import語句的一個變體直接從被導入的模塊中導入命名到本模塊的語義表中。例如這樣可以導入所有除了以下劃線<_>開頭的命名。需要注意的是在實踐中往往不鼓勵從一個模塊或包中使用*導入所有,因為這樣會讓代碼變得很難讀。不過,在交互式會話中這樣用很方便省力。***出于性能考慮,每個模塊在每個解釋器會話中只導入一遍。因此,如果你修改了你的模塊,需要重啟解釋器;或者,如果你就是想交互式的測試這么一個模塊,可以用imp.reload<>重新加載,例如importimp;imp.reload<modulename>。作為腳本來執行模塊當你使用以下方式運行Python模塊時,模塊中的代碼便會被執行pythonfibo.py<arguments>模塊中的代碼會被執行,就像導入它一樣,不過此時__name__被設置為"__main__"。這相當于,如果你在模塊后加入如下代碼:if__name__=="__main__":importsysfib<int<sys.argv[1]>>就可以讓此文件像作為模塊導入時一樣作為腳本執行。此代碼只有在模塊作為"main"文件執行時才被調用:$pythonfibo.py50112358132134如果模塊被導入,不會執行這段代碼:>>>importfibo>>>這通常用來為模塊提供一個便于測試的用戶接口〔將模塊作為腳本執行測試需求。模塊的搜索路徑導入一個叫spam的模塊時,解釋器先在當前目錄中搜索名為spam.py的文件。如果沒有找到的話,接著會到sys.path變量中給出的目錄列表中查找。sys.path變量的初始值來自如下:輸入腳本的目錄〔當前目錄。環境變量PYTHONPATH表示的目錄列表中搜索<這和shell變量PATH具有一樣的語法,即一系列目錄名的列表>。Python默認安裝路徑中搜索。在支持符號連接的文件系統中,輸入的腳本所在的目錄是符號連接指向的目錄。換句話說也就是包含符號鏈接的目錄不會被加到目錄搜索路徑中。實際上,解釋器由sys.path變量指定的路徑目錄搜索模塊,該變量初始化時默認包含了輸入腳本〔或者當前目錄,PYTHONPATH和安裝目錄。這樣就允許Python程序了解如何修改或替換模塊搜索目錄。需要注意的是由于這些目錄中包含有搜索路徑中運行的腳本,所以這些腳本不應該和標準模塊重名,否則在導入模塊時Python會嘗試把這些腳本當作模塊來加載。這通常會引發錯誤。請參見標準模塊以了解更多的信息。"編譯的"Python文件為了加快加載模塊的速度,Python會在__pycache__目錄下以module.version.pyc名字緩存每個模塊編譯后的版本,這里的版本編制了編譯后文件的格式。它通常會包含Python的版本號。例如,在CPython3.3版中,spam.py編譯后的版本將緩存為__pycache__/spam.cpython‐33.pyc。這種命名約定允許由不同發布和不同版本的Python編譯的模塊同時存在。Python會檢查源文件與編譯版的修改日期以確定它是否過期并需要重新編譯。這是完全自動化的過程。同時,編譯后的模塊是跨平臺的,所以同一個庫可以在不同架構的系統之間共享。Python不檢查在兩個不同環境中的緩存。首先,它會永遠重新編譯而且不會存儲直接從命令行加載的模塊。其次,如果沒有源模塊它不會檢查緩存。若要支持沒有源文件〔只有編譯版的發布,編譯后的模塊必須在源目錄下,并且必須沒有源文件的模塊。部分高級技巧:為了減少一個編譯模塊的大小,你可以在Python命令行中使用-O或者-OO。-O參數刪除了斷言語句,-OO參數刪除了斷言語句和__doc__字符串。因為某些程序依賴于這些變量的可用性,你應該只在確定無誤的場合使用這一選項。"優化的"模塊有一個.pyo后綴而不是.pyc后綴。未來的版本可能會改變優化的效果。來自.pyc文件或.pyo文件中的程序不會比來自.py文件的運行更快;.pyc或.pyo文件只是在它們加載的時候更快一些。compileall模塊可以為指定目錄中的所有模塊創建.pyc文件〔或者使用-O參數創建.pyo文件。在PEP3147中有很多關這一部分內容的細節,并且包含了一個決策流程。標準模塊Python帶有一個標準模塊庫,并發布有獨立的文檔,名為Python庫參考手冊〔此后稱其為"庫參考手冊"。有一些模塊內置于解釋器之中,這些操作的訪問接口不是語言內核的一部分,但是已經內置于解釋器了。這既是為了提高效率,也是為了給系統調用等操作系統原生訪問提供接口。這類模塊集合是一個依賴于底層平臺的配置選項。例如,winreg模塊只提供在Windows系統上才有。有一個具體的模塊值得注意:sys,這個模塊內置于所有的Python解釋器。變量sys.ps1和sys.ps2定義了主提示符和輔助提示符字符串這兩個變量只在解釋器的交互模式下有意義。變量sys.path是解釋器模塊搜索路徑的字符串列表。它由環境變量PYTHONPATH初始化,如果沒有設定PYTHONPATH,就由內置的默認值初始化。你可以用標準的字符串操作修改它dir<>函數內置函數dir<>用于按模塊名搜索模塊定義,它返回一個字符串類型的存儲列表:無參數調用時,dir<>函數返回當前定義的命名:注意該列表列出了所有類型的名稱:變量,模塊,函數,等等。dir<>不會列出內置函數和變量名。如果你想列出這些內容,它們在標準模塊builtins中定義:包包通常是使用用"圓點模塊名"的結構化模塊命名空間。例如,名為A.B的模塊表示了名為A的包中名為B的子模塊。正如同用模塊來保存不同的模塊架構可以避免全局變量之間的相互沖突,使用圓點模塊名保存像NumPy或PythonImagingLibrary之類的不同類庫架構可以避免模塊之間的命名沖突。假設你現在想要設計一個模塊集〔一個"包"來統一處理聲音文件和聲音數據。存在幾種不同的聲音格式〔通常由它們的擴展名來標識,例如:.wav,.aiff,.au,于是,為了在不同類型的文件格式之間轉換,你需要維護一個不斷增長的包集合。可能你還想要對聲音數據做很多不同的操作〔例如混音,添加回聲,應用平衡功能,創建一個人造效果,所以你要加入一個無限流模塊來執行這些操作。你的包可能會是這個樣子〔通過分級的文件體系來進行分組:當導入這個包時,Python通過sys.path搜索路徑查找包含這個包的子目錄。為了讓Python將目錄當做內容包,目錄中必須包含__init__.py文件。這是為了避免一個含有爛俗名字的目錄無意中隱藏了稍后在模塊搜索路徑中出現的有效模塊,比如string。最簡單的情況下,只需要一個空的__init__.py文件即可。當然它也可以執行包的初始化代碼,或者定義稍后介紹的__all__變量。用戶可以每次只導入包里的特定模塊,例如:這樣就導入了sound.effects.echo子模塊。它必需通過完整的名稱來引用:sound.effects.echo.echofilter<input,output,delay=0.7,atten=4>導入包時有一個可以選擇的方式:fromsound.effectsimportecho這樣就加載了echo子模塊,并且使得它在沒有包前綴的情況下也可以使用,所以它可以如下方式調用:echo.echofilter<input,output,delay=0.7,atten=4>還有另一種變體用于直接導入函數或變量:fromsound.effects.echoimportechofilter這樣就又一次加載了echo子模塊,但這樣就可以直接調用它的echofilter<>函數:echofilter<input,output,delay=0.7,atten=4>需要注意的是使用frompackageimportitem方式導入包時,這個子項〔item既可以是包中的一個子模塊〔或一個子包,也可以是包中定義的其它命名,像函數、類或變量。import語句首先核對是否包中有這個子項,如果沒有,它假定這是一個模塊,并嘗試加載它。如果沒有找到它,會引發一個ImportError異常。相反,使用類似importitem.subitem.subsubitem這樣的語法時,這些子項必須是包,最后的子項可以是包或模塊,但不能是前面子項中定義的類、函數或變量。從*導入包那么當用戶寫下fromsound.effectsimport*時會發生什么事?理想中,總是希望在文件系統中找出包中所有的子模塊,然后導入它們。這可能會花掉很長時間,并且出現期待之外的邊界效應,導出了希望只能顯式導入的包。對于包的作者來說唯一的解決方案就是給提供一個明確的包索引。import語句按如下條件進行轉換:執行frompackageimport*時,如果包中的__init__.py代碼定義了一個名為__all__的列表,就會按照列表中給出的模塊名進行導入。新版本的包發布時作者可以任意更新這個列表。如果包作者不想import*的時候導入他們的包中所有模塊,那么也可能會決定不支持〔import*。例如,sound/effects/__init__.py這個文件可能包括如下代碼:__all__=["echo","surround","reverse"]這意味著fromsound.effectsimport*語句會從sound包中導入以上三個已命名的子模塊。如果沒有定義__all__,fromsound.effectsimport*語句不會從sound.effects包中導入所有的子模塊。無論包中定義多少命名,只能確定的是導入了sound.effects包〔可能會運行__init__.py中的初始化代碼以及包中定義的所有命名會隨之導入。這樣就從__init__.py中導入了每一個命名〔以及明確導入的子模塊。同樣也包括了前述的import語句從包中明確導入的子模塊,考慮以下代碼:fromsound.effectsimport*在這個例子中,echo和surround模塊導入了當前的命名空間,這是因為執行from...import語句時它們已經定義在sound.effects包中了〔定義了__all__時也會同樣工作。盡管某些模塊設計為使用import*時它只導出符合某種規范/模式的命

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論