2023學(xué)年完整公開課版模塊和包_第1頁
2023學(xué)年完整公開課版模塊和包_第2頁
2023學(xué)年完整公開課版模塊和包_第3頁
2023學(xué)年完整公開課版模塊和包_第4頁
2023學(xué)年完整公開課版模塊和包_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章模塊和包標(biāo)題42目錄1.為什么使用模塊2.模塊的創(chuàng)建與使用3概述概述本章要解決的問題如下:什么是模塊為什么使用模塊如何使用模塊包以及實例41.為什么使用模塊1.1為什么使用模塊首先,提高了代碼的可維護其次,提高了代碼的可重用性最后,避免了函數(shù)名和變量名沖突51.為什么使用模塊1.2模塊角色從抽象的視角來看,模塊至少有三個角色

代碼的重用

系統(tǒng)命名空間的劃分

服務(wù)和數(shù)據(jù)的共享6目錄1.為什么使用模塊2.模塊的創(chuàng)建與使用3.包導(dǎo)入實例72.模塊的創(chuàng)建與使用2.1

Python程序架構(gòu)1.Python程序架構(gòu)實例圖82.模塊的創(chuàng)建與使用假設(shè)上圖中的文件b.py定義了一個名為spam的函數(shù),如下所示:defspam(text):print(text,'spam') 現(xiàn)在,假設(shè)a.py想要使用spam,為了實現(xiàn)這個目標(biāo),a.py中包含如下Python語句:importbb.spam('gumby')92.模塊的創(chuàng)建與使用2.1

Python程序架構(gòu)2.模塊程序和模塊:Python中,程序是作為一個主體的、頂層的文件來構(gòu)造的,配合零個或多個支持文件,這些支持文件都可以稱作模塊。頂層文件:包含了程序的主要的控制流程,即需要運行來啟動應(yīng)用的文件。102.1

Python程序架構(gòu)2.模塊模塊文件:可看作是工具的倉庫,這些倉庫是用來收集頂層文件(或其他可能的地方)使用的組件。頂層文件與模塊文件:頂層文件使用了在模塊文件中定義的工具,這些模塊文件也使用了其他模塊所定義的工具。2.模塊的創(chuàng)建與使用112.模塊的創(chuàng)建與使用2.1

Python程序架構(gòu)模塊的執(zhí)行環(huán)境:模塊包含變量、函數(shù)、類以及其他的模塊(如果導(dǎo)入的話),而函數(shù)也有自己的本地變量。右圖描述了模塊內(nèi)的情況以及與其他模塊的交互。模塊構(gòu)成及工作原理圖122.模塊的創(chuàng)建與使用2.1

Python程序架構(gòu)模塊間的關(guān)系:模塊可以被導(dǎo)入,但模塊也會導(dǎo)入和使用其他模塊,這些模塊可以用Python或其他語言寫成。132.模塊的創(chuàng)建與使用2.1

Python程序架構(gòu)3.模塊導(dǎo)入定義:一個文件可通過加載一個模塊(文件),從而讀取這個模塊(文件)的內(nèi)容,即導(dǎo)入。(1)模塊導(dǎo)入的三種方式importXfromXimport*fromXimporta,b,c142.1

Python程序架構(gòu)3.模塊導(dǎo)入(2)導(dǎo)入模塊時,Python都做了哪些事情?152.模塊的創(chuàng)建與使用2.1

Python程序架構(gòu)3.模塊導(dǎo)入(3)導(dǎo)入模塊時的路徑搜索順序。①程序的主目錄:即程序(頂層)文件所在的目錄,而非啟動程序所在的目錄(當(dāng)前工作目錄。②環(huán)境變量(PYTHONPATH)目錄。③標(biāo)準(zhǔn)鏈接庫目錄。④任何.pth文件的內(nèi)容(如果存在的話),在安裝目錄下找到該文件,以行的形式加入所需要的目錄即可。162.模塊的創(chuàng)建與使用2.2模塊搜索路徑172.模塊的創(chuàng)建與使用2.2模塊搜索路徑1.模塊搜索路徑sys.path的初始值來自于以下地方。包含腳本的當(dāng)前路徑。PYTHONPATH。默認(rèn)安裝路徑。編譯過的Python文件(.pyc文件)。built-in模塊。182.模塊的創(chuàng)建與使用2.2模塊搜索路徑2.配置搜索路徑方法一:添加環(huán)境變量PYTHONPATH。python會添加此路徑下的模塊,在.bashrc文件(這個文件主要保存一些個性化設(shè)置,如命令別名,路徑等)中添加如下類似行。exportPYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.0/site-packages192.模塊的創(chuàng)建與使用2.2模塊搜索路徑方法二:在包內(nèi)添加。在site-packages添加一個路徑文件,如mypkpath.pth,必須以.pth為后綴,寫上你要加入的模塊文件所在的目錄名稱。①windowsc:\python3.0\site-packages②linux(ubuntu)/usr/local/lib/python3.0/dist-packages③linux(redhat)/usr/lib/python3.0/site-packages202.模塊的創(chuàng)建與使用2.2模塊搜索路徑方法三:函數(shù)添加。sys.path.append()函數(shù)添加搜索路徑,參數(shù)值即為要添加的路徑。①importsys②查看sys.path③添加sys.path.append("c:\\")212.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句1.import語句import導(dǎo)入為絕對導(dǎo)入。import只能導(dǎo)入模塊,不能導(dǎo)入模塊中的對象(類、函數(shù)、變量等)222.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句2.嵌套import(1)順序嵌套例如:本模塊導(dǎo)入A模塊(importA),A中又importB,B模塊還可以import其他模塊。232.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句2.嵌套import(2)循環(huán)嵌套,程序如下:#A.pyfromBimportDclassC:pass文件[B.py]fromAimportCclassD:pass為什么執(zhí)行A的時候不能加載D呢?242.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句如果將A.py改為:importB就可以了。這是怎么回事呢?這跟Python內(nèi)部import的機制是有關(guān)的,具體到fromBimportD,Python內(nèi)部會分成以下幾個步驟(具體如右圖所示)。252.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句這個例子的執(zhí)行順序如下(具體如右圖所示)。262.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句3.from語句因為from會把變量名復(fù)制到另外一個作用域,所以它就可以直接在腳本中使用復(fù)制后的變量名,而不需要通過模塊(例如printer)。>>>frommodule1importprinter#復(fù)制一個變量>>>printer('Helloworld!')272.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句4.from*語句當(dāng)使用from*時,會取得模塊頂層所有賦了值的變量名。在腳本中就可以直接使用得到的變量名printer,而不需要通過模塊名。>>>frommodule1import*#復(fù)制所有變量>>>print('Helloworld!')Helloworld!282.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句5.導(dǎo)入只發(fā)生一次模塊會在第一次import或from時載入并執(zhí)行,并且只在第一次如此。292.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句6.import和from是賦值語句(1)from將一個或多個變量名賦值給另一個模塊中同名的對象,例子如下:x=1y=[1,2]%python>>>fromsmallimportx,y #復(fù)制兩個變量>>>x=42 #修改x值>>>y[0]=42 #修改共享變量302.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句6.import和from是賦值語句(2)文件變量名的改變312.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句6.import和from是賦值語句(3)import和from的對等性像這樣的from語句:frommoduleimportname1,name2#復(fù)制兩個變量與下面這些語句是等效的:importmodule #獲取模塊對象name1=1 #賦值name2=2delmodule #刪除模塊名322.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句7.from語句潛在的陷阱from語句會讓變量位置更隱秘和模糊,且從理論上講,from語句有破壞命名空間的“潛質(zhì)”。如果使用from導(dǎo)入變量,而那些變量碰巧和作用域中現(xiàn)有變量同名,變量就會被悄悄地覆蓋掉。另一方面,和reload調(diào)用同時使用時,from語句有比較嚴(yán)重的問題,因為導(dǎo)入的變量名可能引用之前版本的對象。332.模塊的創(chuàng)建與使用2.4模塊命名空間模塊最好理解為變量名的封裝,也就是定義想讓系統(tǒng)其余部分看見變量名的場所。簡而言之,模塊就是命名空間(變量名建立所在的場所),而存在于模塊之內(nèi)的變量名就是模塊對象的屬性。342.模塊的創(chuàng)建與使用2.4模塊命名空間1.文件生成命名空間模塊語句會在首次導(dǎo)入時執(zhí)行頂層的賦值語句會創(chuàng)建模塊屬性模塊的命名空間能通過屬性__dict__或dir(M)獲取352.模塊的創(chuàng)建與使用2.4模塊命名空間LEGB(用來規(guī)定命名空間查找順序的規(guī)則)含義解釋如下。L-Local(function):函數(shù)內(nèi)的名字空間。E-Enclosingfunctionlocals:外部嵌套函數(shù)的名字空間(例如closure)。G-Global(module):函數(shù)定義所在模塊(文件)的名字空間。B-Builtin(Python):Python內(nèi)置模塊的名字空間。362.模塊的創(chuàng)建與使用2.4模塊命名空間假設(shè)往文本編輯器中建立如下的模塊文件,并將其命名為module2.py。print('startingtoload...')importsysname=42deffunc(): pass #定義一個空函數(shù),pass是占位符classklass: pass #定義一個空類,pass是占位符print('doneloading.')執(zhí)行結(jié)果>>>importmodule2startingtoload...doneloading.372.模塊的創(chuàng)建與使用2.4模塊命名空間但是,一旦模塊加載后,它的作用域就變成模塊對象(由import取得)的屬性的命名空間,然后可以結(jié)合其模塊名,通過它來獲取命名空間內(nèi)的屬性。>>>module2.sys<module'sys'(built-in)>>>>42>>>module2.func<functionfuncatox026D3BBB>>>>module2.klass<class'module2.klass'>382.模塊的創(chuàng)建與使用2.4模塊命名空間2.屬性名的點號運算點號運算其實就是表達式,傳回和對象相配的屬性名的值,LEGB規(guī)則只適用于無點號運算的純變量名。其規(guī)則如下:簡單變量點號運算通用性。392.模塊的創(chuàng)建與使用2.4模塊命名空間3.導(dǎo)入和作用域無論程序中的導(dǎo)入結(jié)構(gòu)或函數(shù)調(diào)用的結(jié)構(gòu)是什么情況,變量的含義一定是由源代碼中的賦值語句的位置決定的,而屬性總是伴隨著對對象的請求。換句話說,導(dǎo)入操作不會賦予被導(dǎo)入文件中的代碼對上層代碼的可見度。被導(dǎo)入文件無法看見進行導(dǎo)入的文件內(nèi)的變量名。402.模塊的創(chuàng)建與使用2.4模塊命名空間4.命名空間的嵌套雖然模塊導(dǎo)入不會使命名空間發(fā)生向上的嵌套,但會發(fā)生向下的嵌套。利用屬性的點號運算路徑,有可能深入到任意嵌套的模塊中并讀取其屬性。412.模塊的創(chuàng)建與使用2.5

reload在python中,每一個以.py結(jié)尾的Python文件都是一個模塊,其他的文件可以通過導(dǎo)入一個模塊來讀取該模塊的內(nèi)容。默認(rèn)情況下,模塊在第一次被導(dǎo)入之后,其他的導(dǎo)入都不再有效。那么想要使得Python在同一次會話中再次運行文件,就需要調(diào)用imp標(biāo)準(zhǔn)庫模塊中的reload函數(shù)。422.模塊的創(chuàng)建與使用2.5

reloadreload與import和from的不同之處如下。reload是Python*的內(nèi)置函數(shù),而不是語句。傳給reload的是已經(jīng)存在的模塊對象,而不是變量名。reload在Python3.0中位于模塊之中,并且必須導(dǎo)入自己。432.模塊的創(chuàng)建與使用2.5

reload此外,import語句和reload調(diào)用的語法并不相同,reload需要小括號,但import不需要。重載如下所示:importmodule #初始導(dǎo)入usemodule.attributes #使用模塊fromimpimportreload#獲取重載函數(shù)reload(module) #重載模塊usemodule.attributes…442.模塊的創(chuàng)建與使用2.5

reload程序重載任何引用該模塊對象的地方,自動會受到reload的影響,下面是一些細(xì)節(jié):reload會在模塊當(dāng)前命名空間內(nèi)執(zhí)行模塊文件的新代碼文件中頂層賦值語句會使得變量名換成新值重載會影響所有使用import讀取了模塊的客戶端重載只會對以后使用from的客戶端造成影響45目錄1.為什么使用模塊2.模塊的創(chuàng)建與使用3.包導(dǎo)入實例463.包導(dǎo)入實例包的組成Python的程序由包(package)、模塊(module)和函數(shù)組成。包是由一系列模塊組成的集合,模塊是處理某一類問題的函數(shù)和類的集合,它們之間的關(guān)系如右圖所示。473.包導(dǎo)入實例包與模塊的樹形圖

首先定義一個包parent,在parent包中創(chuàng)建兩個子包pack和pack2,pack包中定義一個模塊myModule,pack2包中定義一個模塊myModule2。最后在包parent中定義一個模塊main,調(diào)用子包pack和pack2,樹形圖如右圖所示。483.包導(dǎo)入實例包pack的__int__.py程序如下所示:if_name_=='_main_':print('作為主程序運行')else:

print('pack初始化')

這段代碼初始化pack包,直接輸出一段字符串。當(dāng)pack包將其他模塊調(diào)用時,將輸出“pack初始化”。493.包導(dǎo)入實例包pack的myModule模塊如下所示:deffunc():print("pack.myModule.func()")if_name_=='_main_':print('作為主程序運行')else:

print('pack初始化')當(dāng)pack2包被其他模塊調(diào)用時,先執(zhí)行__int__.py文件。503.包導(dǎo)入實例pack2包的__int__.py程序如下所示。if_name_=='_main_':p

溫馨提示

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

最新文檔

評論

0/150

提交評論