教會(huì)你所有的Python模塊使用_第1頁(yè)
教會(huì)你所有的Python模塊使用_第2頁(yè)
教會(huì)你所有的Python模塊使用_第3頁(yè)
教會(huì)你所有的Python模塊使用_第4頁(yè)
教會(huì)你所有的Python模塊使用_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論