




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第10章模塊模塊的作用…………….......0.5課時模塊的導入………………...........................2.5課時模塊包…………….………..1.5課時模塊使用技巧…………...…0.5課時授課計劃模塊的作用將Python代碼寫入一個文本文件,為其起一個以.py為后綴的文件名,這就創(chuàng)建了一個Python源文件一個Python源文件也是一個模塊模塊最重要的功能是實現了代碼重用:模塊中的程序代碼以文件的形式被存儲起來,可以隨時運行模塊中的程序代碼可以被導入到外部的其它程序之中,導入之后,模塊中定義的數據、函數、類等任何對象都可以被其它程序使用如何定義模塊模塊是Python中層次最高的代碼單元,起到了分割Python命名空間的作用模塊中定義的變量名只為模塊自己所有,各個模塊中的變量彼此獨立,一個模塊只有先進行導入操作,才能使用被導入模塊中的變量,使用這種隱式的方式讓變量名從屬于模塊,有助于消除命名沖突當模塊被導入時,Python會把變量__name__賦值為源程序文件的文件名,即模塊名就是文件名當源程序文件被直接運行時,變量__name__被賦值為'__main__',即Python頂層程序對應的模塊為'__main__'模塊的作用如下圖所示,定義一個頂層文件a.py,導入了模塊文件b.py,后者導入了模塊文件c.py,文件b.py和c.py都導入了Python的標準庫模塊python程序的組織形式模塊文件b.py和c.py由可執(zhí)行的Python語句構成,這與任何一個Python源程序文件無異,但作為模塊,它們一般不被直接運行,而是定義了供其它程序導入后調用的對象如下圖所示,在文件b.py中定義了如下一個函數spam()如下圖所示,頂層文件a.py使用如下的方式先導入模塊文件b.py,再調用其定義的函數spam()頂層文件a.py使用import語句導入模塊b,實際上是在內存中創(chuàng)建了一個被導入的模塊對象,并將模塊名b賦給該對象頂層文件a.py就可以通過變量名b指代的模塊對象訪問原模塊文件b.py中定義的函數spam()模塊文件的調用關系def
spam(text):
#文件
b.py
print(text)importb#文件a.pyb.spam('hi')模塊的導入使用關鍵字import后跟要導入的模塊名來導入模塊要導入多個模塊,可以將各個模塊名以逗號分割,置于import之后,但Python編碼規(guī)范PEP-8建議分行書寫,一個import之后只出現一個模塊名,示例如下:還可以使用關鍵字as為被導入的模塊起一個新名字例如,用于科學計算的模塊numpy常被這樣導入:importnumpyasnp,這里的np是其約定俗成的簡稱import語句importmathimportrandom
alpha=random.random()print(math.pow(math.sin(alpha),
2)
+math.pow(math.cos(alpha),
2))程序在第一次導入模塊時,依次執(zhí)行了三個步驟:首先,搜索要導入的模塊文件其次,將模塊文件中的源代碼編譯成字節(jié)碼(如能找到已編譯好的字節(jié)碼,則略去此步)最后,執(zhí)行字節(jié)碼來創(chuàng)建模塊對象需要注意,這些步驟只在模塊第一次被導入時才會執(zhí)行當重復導入同一個模塊時,Python只會從內存中提取已經加載好的模塊對象從技術上講,Python把加載好的模塊信息存儲在一個名為sys.modules的字典中,一個模塊被導入時會查詢這個字典,僅當沒有發(fā)現被導入的模塊時才會執(zhí)行上述三個步驟import導入模塊在導入模塊時,Python依次在如下位置搜索模塊文件:程序當前目錄環(huán)境變量PYTHONPATH中的目錄標準鏈接庫目錄任何置于Python安裝目錄下的以.pth為后綴名的文本文件中的內容以上四個位置的組合構成了Python尋找被導入模塊文件時的搜索路徑,可以通過sys模塊的sys.path屬性查看,如下圖展示了Windows系統(tǒng)上Python3.9的sys.path內容注意sys.path的第一個元素是一個空字符串,這是因為上例中Python解釋器是在交互模式下被調用的,此時sys.path[0]被設置成空字符串搜索模塊文件.pth文件允許用戶把有效的目錄添加到搜索路徑中去只要創(chuàng)建一個以.pth為擴展名的文本文件,把想要包含的路徑添加進去,最后將該文件放置到合適的位置,即可將它們加入到搜索路徑中至于.pth文件的存放位置,不同平臺不盡相同,可以通過如下方式查看:在Windows操作系統(tǒng)的C:\Python39目錄下創(chuàng)建名為foo.pth的文件,寫入一行已存在的路徑,如C:\Users,新啟動一個Python交互環(huán)境,導入sys模塊后查看sys.path屬性,如下圖所示:.pth文件找到模塊文件之后,Python會將其編譯成字節(jié)碼,以供解釋器執(zhí)行,其實該步驟并不會每次都發(fā)生:Python總在第一次導入模塊文件時將其編譯成字節(jié)碼,并將其以.pyc為文件擴展名存儲在當前目錄下的名為__pycache__的子目錄之中之后再次導入模塊時,如果該.pyc文件還存在,Python會檢查文件的時間戳,如果.pyc文件比.py文件新,就會跳過編譯步驟如果.pyc文件不存在,或者比.py文件舊,就會再次執(zhí)行編譯過程實際上,如果在搜索路徑中只有模塊的字節(jié)碼文件,該模塊一樣可以被導入,這就意味著你可以將Python程序以字節(jié)碼的形式向外發(fā)布,而不提供源代碼編譯成字節(jié)碼我們通常不會見到程序的頂層文件所對應的.pyc文件,這是因為頂層文件的字節(jié)碼在Python內部使用過后就被自動丟棄,除非該頂層文件也作為模塊被其他文件導入過這樣看來,只有被導入的文件才會在機器上留下相應的.pyc文件,使用.pyc保存字節(jié)碼是為了減少重復編譯,提高執(zhí)行效率導入模塊的最后一步是執(zhí)行字節(jié)碼,以生成模塊對象在這一步中,Python會從頭至尾的執(zhí)行被導入模塊文件中的語句,所生成的頂層對象會成為模塊的屬性執(zhí)行字節(jié)碼使用形如from…import這樣的語句將模塊中特定的部分導入當前命名空間中,而不把整個模塊導入實際上,from…import語句在執(zhí)行時同樣需要導入模塊,只不過在此之后多了一步,即將變量名復制到當前作用域,這樣我們就可以直接使用模塊中的變量名而無需通過module.attribute的形式來調用模塊的屬性從作用上看,如下的from…import語句和下面的四條語句是等價的from…import語句frommoduleimportname1,name2importmodulename1=module.name1name2=module.name2delmodule使用from…import語句從模塊中導入變量名可能會覆蓋當前命名空間中的同名變量假設模塊文件spam.py中只有一行賦值語句x=1,在交互環(huán)境中定義一個同名變量x=0,再執(zhí)行fromspamimportx語句,就會發(fā)現變量x的值變成了1,如下所示:from…import語句讓用戶在使用模塊中的變量時不必輸入模塊名,也可以用關鍵字as為被導入對象起一個新名字,為了避免潛在的變量名覆蓋,可以這樣做:from…import語句fromosimportopenasos_openfrom…import語句還有一種使用通配符“*”的所謂“全部導入”的形式:這樣做會在當前命名空間中生成被導入模塊頂層的所有被賦值的變量,之后這些變量就都可以被直接使用import為整個模塊對象賦一個變量名,而from…import將當前命名空間中的變量名賦給被導入模塊中的同名對象執(zhí)行from…import語句在當前命名空間中所生成的變量名會和被導入模塊中的同名變量共享對象的引用如果被共享引用的對象是列表等可變對象,則在當前命名空間中的修改就會影響到被導入模塊中的值我們創(chuàng)建一個模塊文件spam.py內容如下from…import語句frommoduleimport
*x=
1y=
[1,
2]在交互環(huán)境中使用from…import導入該spam模塊變量x引用的整數對象是不可變對象,而變量y引用的列表是可變對象,使用下標索引的方式對列表對象的第一個元素進行原地修改,如下所示:在同一個交互環(huán)境中使用import語句導入spam模塊,查看其屬性spam.x和spam.y的值,如下所示:from…import實例Python還提供了兩種在使用from…import*語句進行全部導入時隱藏模塊內名稱的方法,形如_x的名稱不會被from…import*語句導入,如在模塊文件spam.py中做如下定義:在交互環(huán)境中使用fromspamimport*進行全導入,可以看到以下畫線開頭的名稱不可訪問,如下所示:from…import*語句_x=
1y=
2def
_f():
print('hi')在Python中沒有嚴格意義上的私有屬性,在對被保護變量的訪問控制上,如果用戶執(zhí)意要做,Python并不會阻止上述這種隱藏變量名的方式僅對from…import*語句有效,使用import語句一樣可以訪問以下畫線開頭的名稱,如左下圖所示:在from…import語句中顯示的列出以下畫線開頭的名稱也一樣可以將其導入,如右下圖所示:from…import*語句可以在模塊文件中定義一個名為__all__的列表,在其中列出使用from…import*語句時要導入的名稱例如,在模塊文件spam.py中做如下定義:如左下圖所示,在交互環(huán)境中使用fromspamimport*進行全導入,可以看到列表__all__所包含的變量皆可導入,當然列表__all__對導入的控制一樣可以被繞過,如右下圖所示:__all__列表__all__=
['_x','y']_x=
1y=
2z=
3Python只有在第一次執(zhí)行import語句時才會執(zhí)行被導入模塊文件中的代碼并創(chuàng)建模塊對象,之后再執(zhí)行import語句不會重新執(zhí)行模塊的代碼當修改被導入模塊的代碼,需要再次導入此模塊時,默認的導入方式就會出現問題,我們創(chuàng)建一個模塊文件spam.py,其內容如下:然后在交互環(huán)境中使用importspam導入該模塊,可以看到打印輸出了字符串hi,這是執(zhí)行模塊文件中代碼print('hi')的結果引入reload()函數x=
1print('hi')修改原模塊文件spam.py,將其中的賦值語句改為x=2,在同一個交互環(huán)境中使用importspam語句再次導入spam模塊,發(fā)現沒有打印輸出,spam.x仍是舊值1,這證明第二次導入同一模塊并不會執(zhí)行模塊文件中的代碼要在后續(xù)導入過程中強制執(zhí)行模塊中的代碼,需要使用reload()函數,它位于標準庫模塊importlib中上例在修改了spam.py的內容后,使用如下方式再次導入spam模塊,就會重新執(zhí)行模塊文件中的代碼reload()函數函數reload()的參數需要是一個模塊對象,這意味著該模塊在之前已經被導入當一個模塊被重新導入時,模塊文件中對已有變量所賦的新值會覆蓋舊值,如果在模塊文件中刪除了某個已有變量,它還會存在于重新導入后的模塊對象中例如,繼續(xù)修改上述spam.py文件,將x=2替換成y=3,然后在同一個交互環(huán)境下再次導入,如下所示:reload()函數模塊包我們將一個包含Python代碼文件的目錄稱為模塊包(modulepackage),相應的導入即為包導入要使用包導入,只需在import語句中列出目錄路徑,不同層次間以點號間隔例如,導入dir1/dir2目錄下的model.py模塊文件,可以寫作:對于from…import語句也一樣:以上語句中的dir1.dir2.module表示機器上有一個名為dir1的目錄,其有一個子目錄dir2,而dir2中包含一個名為module.py的模塊文件模塊包的定義importdir1.dir2.modulefromdir1.dir2.moduleimportx要使用包導入,還需遵循一個規(guī)則:由點號分割的每個目錄中都必須有一個名為__init__.py的文件,否則包導入失敗上述包導入語句importdir1.dir2.module對應的目錄結構,如下所示:__init__.py文件可以是空的,也可以包含Python程序代碼,所包含的代碼會在首次導入包時被自動執(zhí)行要求模塊包路徑上的每一層目錄都含有一個__init__.py文件可以防止有相同名稱的目錄先于模塊包出現在搜索路徑中包導入dir0/dir1/__init__.pydir2/__init__.pymodule.pyPython在首次導入某個包時會自動執(zhí)行路徑目錄下__init__.py中的代碼仍以importdir1.dir2.module為例,假設路徑上兩個__init__.py文件內容分別如下:被導入的模塊文件module.py內容如下:包導入示例#dir0/dir1/__init__.pyprint('dir1init')x=
1#dir0/dir1/dir2/__init__.pyprint('dir2init')y=
2#dir0/dir1/dir2/module.pyprint('module.py')z=
3在dir0目錄下啟動Python交互環(huán)境,導入模塊,輸出的內容印證了兩個__init__.py文件的代碼被依次執(zhí)行,如左下圖所示:如果使用from…import*語句導入一個目錄下的所有模塊,沿用上例,假設目錄dir0/dir1/dir2/下有spam.p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新能源汽車產業(yè)鏈投資合作框架合同
- 電影院線放映權授權協議
- 假如時光可以倒流中考作文10篇
- 企業(yè)員工績效管理標準化體系
- 商業(yè)保密保密協議條款說明
- 初三物理電學動態(tài)電路難題試卷及答案
- 《青山不老》課件
- 企業(yè)安全生產事故預防及處理方案工具
- 2025年基本公共衛(wèi)生考試題目(附答案)
- 2025年基本公共衛(wèi)生服務項目考試試題及答案
- 腫瘤病人疼痛護理課件
- 酒店餐飲英語培訓課件
- 2025年長沙市中考物理試卷真題(含答案)
- 外科術后康復
- 口腔科主任述職報告
- 心臟驟停的急救及處理
- 營養(yǎng)科專案管理制度
- 達州國企考試試題及答案
- 2025四川省人力資源和社會保障廳制勞動合同書
- 2025-2030年海洋環(huán)境監(jiān)測行業(yè)市場發(fā)展分析及發(fā)展前景與投資機會研究報告
- 浙江花園營養(yǎng)科技有限公司 年產750噸飼料級VD3油劑項目環(huán)評報告
評論
0/150
提交評論