《Python程序設(shè)計》課件6-模塊與包_第1頁
《Python程序設(shè)計》課件6-模塊與包_第2頁
《Python程序設(shè)計》課件6-模塊與包_第3頁
《Python程序設(shè)計》課件6-模塊與包_第4頁
《Python程序設(shè)計》課件6-模塊與包_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

~1~第六章模塊與包目錄模塊包編程實踐本章習題-2-模塊與包隨著軟件任務(wù)變得日益復(fù)雜,編寫的程序代碼量也急劇增加,因此有效地管理這些代碼變得尤為重要在許多情況下,代碼的開發(fā)是一個團隊協(xié)作的過程,這就要求必須考慮團隊成員之間的協(xié)同性借鑒軟件工程中的“分而治之”原則,一個大的軟件項目可以被劃分成多個小的單元,這些單元即為模塊,而相關(guān)聯(lián)且功能緊密的多個模塊根據(jù)它們的物理或邏輯關(guān)系被組織在一起,形成了包這樣的代碼組織方式不僅有利于功能劃分,也促進了代碼復(fù)用和便于維護3模塊的基本概念函數(shù)與模塊函數(shù)的重用:函數(shù)提供精細的代碼重用機制,其方法是:通過導(dǎo)入函數(shù)定義。模塊的重用:模塊包含多個函數(shù)或變量,整體導(dǎo)入,提高效率,簡化重用(如繪圖函數(shù)集)。示例:一次性導(dǎo)入繪圖模塊,使用所有相關(guān)功能。模塊的價值代碼組織模塊作為功能容器:封裝函數(shù)、類和變量劃分:邏輯上獨立的部分,專注特定任務(wù)可維護性與模塊化提升代碼可讀性和重用性減少名稱沖突,簡化團隊協(xié)作實際應(yīng)用示例數(shù)據(jù)分析:將函數(shù)集合保存在單一模塊,跨項目重用4Python模塊在Python中,一個模塊實際上就是一個擁有.py后綴的文件。這意味著每個Python文件本身都可以被視為一個模塊,可以被其他Python代碼導(dǎo)入和使用假設(shè)有一個名為math_operations.py的模塊,它定義了一些基本的數(shù)學運算:#math_operations.pydefadd(x,y):returnx+ydefsubtract(x,y):returnx-ydefmultiply(x,y):returnx*ydefdivide(x,y):returnx/y在另一個文件中,可以導(dǎo)入這個模塊,并使用其中定義的函數(shù):#main.pyimportmath_operationssum_result=math_operations.add(10,5)product_result=math_operations.multiply(10,5))5程序結(jié)構(gòu)通常由多個互相協(xié)作的文件構(gòu)成包括一個主要的入口文件以及多個模塊文件主入口文件負責定義整個程序的主要流程,它通過調(diào)用其他模塊文件中的函數(shù)來執(zhí)行各種特定的任務(wù)這些模塊文件又可能相互調(diào)用,形成一個功能豐富的網(wǎng)絡(luò)模塊文件還可以利用Python的內(nèi)置標準庫來擴展其功能6模塊循環(huán)引用問題在Python中,兩個模塊相互引用是可能的,但這種情況需要小心處理,否則容易引起循環(huán)引用問題,特別是在模塊級別的代碼執(zhí)行時循環(huán)引用主要發(fā)生在兩個或更多的模塊互相導(dǎo)入對方,這可能導(dǎo)致導(dǎo)入失敗或者運行時錯誤,因為Python解釋器在處理導(dǎo)入語句時可能遇到尚未完全初始化的模塊如何解決或避免循環(huán)引用1.重新設(shè)計代碼結(jié)構(gòu):通常,循環(huán)引用表明可能需要重新考慮模塊的設(shè)計。盡量避免模塊間的直接依賴,或者將相互依賴的部分提取到一個單獨的模塊中2.使用局部導(dǎo)入:將導(dǎo)入語句放在函數(shù)內(nèi)部或者需要它的地方,而不是文件的頂部。這樣,只有在實際需要模塊功能的時候才進行導(dǎo)入,可以避免初始化階段的循環(huán)依賴問題3.延遲導(dǎo)入:對于類定義中可能出現(xiàn)的循環(huán)引用,可以在類的方法內(nèi)部進行導(dǎo)入,從而延遲導(dǎo)入的時機7示例假設(shè)有兩個模塊,moduleA和moduleB,并且它們需要相互引用8#moduleA.pyfrommoduleBimportBclassA:deffoo(self):print("Afoo")b=B()b.bar()#moduleB.pyfrommoduleAimportAclassB:defbar(self):print("Bbar")a=A()a.foo()#moduleA.pyclassA:deffoo(self):frommoduleBimportBprint("Afoo")b=B()b.bar()#moduleB.pyclassB:defbar(self):frommoduleAimportAprint("Bbar")a=A()a.foo()模塊的導(dǎo)入與使用Python有兩種主要的模塊導(dǎo)入方法:導(dǎo)入整個模塊和從模塊中導(dǎo)入特定對象1.導(dǎo)入整個模塊:使用import關(guān)鍵字導(dǎo)入一個完整的模塊,使得當前文件可訪問模塊中定義的所有函數(shù)和類語法結(jié)構(gòu)import模塊名[as別名]#導(dǎo)入模塊并起一個別名模塊名.對象名#訪問該模塊中的對象別名.對象名#作用同上一句舉例:importmathprint(math.sqrt(16))#輸出:4.0importnumpyasnp#導(dǎo)入numpy模塊,并定義別名npnp.array([1,2,3]))#調(diào)用np中的array對象9模塊的導(dǎo)入與使用2.從模塊中導(dǎo)入特定對象如果只需要使用模塊中的特定函數(shù)或類,可以選擇只導(dǎo)入需要的部分。這樣做有助于節(jié)省內(nèi)存,提高程序效率語法結(jié)構(gòu):from模塊名import對象名[as別名]舉例:frommathimportsqrtprint(sqrt(16))#導(dǎo)入sqr對象后直接使用,不用加限定的模塊名.輸出:4.010模塊的__name__在Python中,每個模塊都包含一個內(nèi)置的屬性__name__若模塊是被直接運行,__name__的值被設(shè)為__main__若它是被導(dǎo)入到另一個模塊中,__name__則會被設(shè)為該模塊的文件名(不包括.py擴展名)。該屬性的特性可用來控制模塊的行為,依據(jù)模塊是作為獨立程序運行還是被導(dǎo)入使用。if__name__=="__main__":#該代碼塊僅在模塊直接運行時執(zhí)行

main_function()__name__屬性適合于在模塊中進行單元測試或者將其作為獨立腳本執(zhí)行defadd(a,b):returna+bif__name__=="__main__":#這些測試代碼只在模塊被直接運行時執(zhí)行

assertadd(2,3)==511編寫模塊模塊通常由三部分組成:函數(shù)和類定義:這些是模塊的主要組成部分,用于定義可重用的函數(shù)和類頂層代碼:這是模塊的主體部分,可以包含函數(shù)調(diào)用、類實例化等操作可執(zhí)行語句:位于模塊底部,通常用于測試。這部分代碼應(yīng)當放在if__name__=="__main__":塊中,以確保只有在模塊被直接運行時才執(zhí)行模塊的命名和組織命名:模塊名應(yīng)該簡潔且描述性強。通常使用小寫字母,多個單詞間可用下劃線分隔組織:將相關(guān)的函數(shù)和類組織到同一個模塊中。例如,所有與數(shù)學相關(guān)的函數(shù)可以放在一個名為math_utils.py的模塊中12編寫模塊編寫一個簡單的模塊#greetings.py#函數(shù)和類定義defsay_hello(name):returnf"Hello{name}!"defsay_goodbye(name):returnf"Goodbye{name}!“#頂層代碼print("Greetingsmoduleisloaded.")#可執(zhí)行語句if__name__=="__main__":#測試模塊功能

print(say_hello("Alice"))print(say_goodbye("Bob"))136.2包多個變量和運算構(gòu)成了函數(shù),多個函數(shù)和全局變量構(gòu)成了模塊,那么多個模塊構(gòu)成了包(package)在Python中,一個包可看作包含多個模塊的目錄,它通過文件夾和文件的形式組織模塊,并允許創(chuàng)建模塊的層次結(jié)構(gòu)Python中引入包的概念是符合模塊化的設(shè)計思想,將多個相關(guān)的模塊放在同一個包中,便于管理和查詢,可大幅簡化文件搜索路徑設(shè)置,也使得程序更易于理解14創(chuàng)建包從包的基本結(jié)構(gòu)來講,包實際上是一個文件目錄,用來包含多個相關(guān)的模塊文件每個包目錄下必須有一個名為

__init__.py的Python文件,用來標識該目錄為Python的一個包,即使該文件是一個沒有任何內(nèi)容的空文件例如,在一個網(wǎng)上商城的應(yīng)用中,可能會創(chuàng)建一個名為ecommerce的包,它包含了各種管理在線交易的模塊ecommerce/├──__init__.py├──shopping_cart.py├──payments.py├──products.py└──customers.py15使用包當需要在程序中使用包中的模塊時,可使用import導(dǎo)入語句導(dǎo)入某一個包中的模塊語法結(jié)構(gòu)from包名import模塊名例如,要導(dǎo)入上面例子中的shopping_cart模塊:fromecommerceimportshopping_cart或者,若只需要使用這個模塊中的特定函數(shù)或類:fromecommerce.shopping_cartimportadd_to_cart16絕對導(dǎo)入根據(jù)PEP8規(guī)范,在Python中導(dǎo)入模塊時,推薦使用絕對導(dǎo)入而不是相對導(dǎo)入絕對導(dǎo)入:絕對導(dǎo)入使用完整的路徑從項目的根目錄開始引用模塊。這種方法明確了模塊在項目中的位置,使得代碼更容易理解,尤其是在大型項目中my_project/├──main.py└──mypackage/├──__init__.py├──submodule1.py└──submodule2.py若想在main.py中導(dǎo)入mypackage下的submodule1:#main.pyimportmypackage.submodule1相對導(dǎo)入:使用當前模塊的位置作為參考點來導(dǎo)入其他模塊。使用點(.)符號表示當前目錄#submodule2.pyfrom.importsubmodule1#從當前包中導(dǎo)入名為submodule1的模塊17案例:經(jīng)典的包分層結(jié)構(gòu)在Python項目開發(fā)中,一個經(jīng)典且廣泛使用的包結(jié)構(gòu)通常包括若干核心組件,如模塊、子包、測試代碼、安裝腳本、文檔等my_project/│├──my_project/#主包目錄│├──__init__.py#初始化腳本,定義包的導(dǎo)入行為│├──module1.py#主包的模塊│├──module2.py#另一個主包的模塊│├──subpackage1/#子包││├──__init__.py#子包的初始化腳本││├──submodule1.py#子包內(nèi)的模塊││└──submodule2.py#另一個子包內(nèi)的模塊│└──subpackage2/│├──__init__.py│├──submodule1.py│└──submodule2.py│├──tests/#測試目錄│├──__init__.py│├──test_module1.py#測試模塊1│├──test_module2.py#測試模塊2│├──test_submodule1.py#測試子模塊1│└──test_submodule2.py#測試子模塊2│├──docs/#文檔目錄│├──conf.py#Sphinx文檔配置文件│├──index.rst#主文檔文件│└──...#其他文檔文件│├──setup.py#安裝腳本├──README.md#項目README文件└──LICENSE#許可證文件18-my_project:這是頂層包目錄,所有的源代碼都在這個目錄下。-__init__.py:這個文件使Python將包含它的目錄視為一個包。它可以為空或者定義包的初始化代碼。-module1.py,module2.py:主包中的模塊文件。-subpackage1/,subpackage2/:包內(nèi)的子包,每個子包可以包含自己的模塊和子包。-tests/:包含所有單元測試。測試通常以`test_`開頭命名。-docs/:存放項目文檔的目錄,常使用Sphinx生成文檔。-setup.py:安裝腳本,定義了包的依賴關(guān)系和元數(shù)據(jù),用于發(fā)布到PyPI等。-README.md:項目的簡介文件,通常包含項目說明、安裝和使用指南。-LICENSE:項目的許可證文件,說明項目的使用和分發(fā)條件。案例:機器學習包的分層結(jié)構(gòu)機器學習是一個應(yīng)用數(shù)學和統(tǒng)計學方法,使計算機系統(tǒng)利用數(shù)據(jù)進行學習和模式識別的研究領(lǐng)域。它通過建立算法模型,基于提供的數(shù)據(jù)進行預(yù)測或決策分類:這類算法將數(shù)據(jù)分入預(yù)先定義的標簽或類別,通常用于預(yù)測屬于哪個類別的任務(wù)聚類:這類算法嘗試將數(shù)據(jù)集中的樣本分組,使得組內(nèi)的樣本比其他組的樣本更相似,常用于探索性數(shù)據(jù)分析回歸:回歸算法預(yù)測連續(xù)值的輸出,如房價或銷售量等19機器學習包的示

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論