第5章 函數(shù)與模塊《Python語言程序設(shè)計》教學(xué)課件_第1頁
第5章 函數(shù)與模塊《Python語言程序設(shè)計》教學(xué)課件_第2頁
第5章 函數(shù)與模塊《Python語言程序設(shè)計》教學(xué)課件_第3頁
第5章 函數(shù)與模塊《Python語言程序設(shè)計》教學(xué)課件_第4頁
第5章 函數(shù)與模塊《Python語言程序設(shè)計》教學(xué)課件_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《Python語言程序設(shè)計》?精品課件合集Python語言程序設(shè)計第5章函數(shù)與模塊第5章函數(shù)與模塊5.1函數(shù)的定義與調(diào)用函數(shù)(Function)是指可重復(fù)使用的語句塊,該語句塊通常用于實現(xiàn)一組特定的功能。在程序中可以通過定義和使用函數(shù)來提高代碼的復(fù)用性,從而提高編程效率及程序的可讀性。在程序中使用函數(shù),也被稱為函數(shù)調(diào)用(Calling)。函數(shù)的定義3/63函數(shù)(Function)是指可重復(fù)使用的語句塊,該語句塊通常用于實現(xiàn)一組特定的功能。在程序中可以通過定義和使用函數(shù)來提高代碼的復(fù)用性,從而提高編程效率及程序的可讀性。在程序中使用函數(shù),也被稱為函數(shù)調(diào)用(Calling)。函數(shù)在被調(diào)用之前,需要先通過關(guān)鍵字def來完成函數(shù)定義,語法格式如下所示。def函數(shù)名([參數(shù)1[,參數(shù)2…[,參數(shù)n]]]):

函數(shù)體函數(shù)的定義4/63由上述程序可知,函數(shù)定義中,函數(shù)名必須是合法的標(biāo)識符,函數(shù)名后的一對圓括號用于指定函數(shù)的參數(shù),若沒有參數(shù)也可以省略。函數(shù)定義中的參數(shù)被稱為形式參數(shù)(FormalParameters),用于接受函數(shù)調(diào)用時傳遞來的實際參數(shù)值。為了正確表示函數(shù)體,需要在格式上將其向右縮進(jìn)。案例:函數(shù)的定義與調(diào)用5/63函數(shù)體的第一行語句可以是一個對函數(shù)作用進(jìn)行說明的字符串對象,被稱作文檔字符串(DocumentationString或docstring)。一個函數(shù)的文檔字符串可以通過該函數(shù)屬性__doc__訪問得到。例如,運行程序例5_1后,函數(shù)say_hello()被成功定義,此時可以使用如下語句訪問該函數(shù)的__doc__屬性。文檔字符串6/63函數(shù)定義后,便可以通過調(diào)用函數(shù),以運行函數(shù)體中定義的代碼段,函數(shù)調(diào)用的語法格式為:函數(shù)名([參數(shù)1[,參數(shù)2…[,參數(shù)n]]])其中,函數(shù)名是定義函數(shù)時在def關(guān)鍵字后給出的標(biāo)識符,參數(shù)列表包含要傳入函數(shù)的一系列對象,函數(shù)調(diào)用中所使用的具體參數(shù)也被稱作實際參數(shù)(ActualParameters)。函數(shù)的調(diào)用7/63例如,編寫程序定義滿足以下功能的函數(shù),該函數(shù)用來判斷給定的參數(shù)n是否為一個素數(shù),并輸出判斷結(jié)果,程序如下。程序的運行結(jié)果如下:案例:判斷一個整數(shù)是否為素數(shù)8/63如果在函數(shù)調(diào)用時,需要傳遞不止1個實際參數(shù),則需要在函數(shù)定義時構(gòu)造相同數(shù)量的形式參數(shù),例如編寫程序定義滿足以下功能的函數(shù),該函數(shù)用于計算兩個對象的和,并輸出計算結(jié)果,程序如下所示。程序的運行結(jié)果如下:案例:定義多個參數(shù)9/63在函數(shù)體中,可以使用由關(guān)鍵字return構(gòu)造的語句,其語法格式為:return[對象1[,對象2…[,對象n]]]該語句的作用是將return關(guān)鍵字后的對象返回給調(diào)用該函數(shù)的語句,并跳過函數(shù)體中剩下的語句,即終止函數(shù)體轉(zhuǎn)而運行函數(shù)調(diào)用之后的語句。如果函數(shù)體中不包含return語句或者return語句中省略了待返回的對象,則程序會把空值對象None返回給調(diào)用該函數(shù)的語句。函數(shù)的返回值和return語句10/63例如,編寫程序提示用戶輸入兩個整數(shù),輸出其中較大的一個,如果兩者相同則輸出提示信息“兩個數(shù)字相等”,要求在程序中定義函數(shù)完成比較兩數(shù)大小的功能,程序如下所示。案例:定義函數(shù)求參數(shù)中較大的值11/63return語句也可以同時將多個對象返回給調(diào)用函數(shù)的語句。例如,編寫程序提示用戶輸入兩個整數(shù),比較這兩個數(shù)并按照自小至大的順序輸出,如果兩者相同則輸出提示信息“兩個數(shù)字相等”,要求在程序中定義函數(shù)完成比較兩數(shù)大小的功能并按照自小至大的順序返回兩個數(shù),程序如下所示。案例:定義函數(shù)返回排序后的參數(shù)值12/63當(dāng)函數(shù)的函數(shù)體特別簡單,僅使用一條表達(dá)式就可以表示其返回值的時候,可以使用lambda關(guān)鍵字構(gòu)造lambda表達(dá)式進(jìn)行函數(shù)定義,lambda表達(dá)式的語法格式如下:匿名函數(shù)與lambda表達(dá)式13/63當(dāng)函數(shù)的函數(shù)體特別簡單,僅使用一條表達(dá)式就可以表示其返回值的時候,可以使用lambda關(guān)鍵字構(gòu)造lambda表達(dá)式進(jìn)行函數(shù)定義,lambda表達(dá)式的語法格式如下:lambda[參數(shù)1[,參數(shù)2…[,參數(shù)n]]]:返回值表達(dá)式由于lambda表達(dá)式中僅包含函數(shù)的參數(shù)和返回值表達(dá)式,沒有用作函數(shù)名的標(biāo)識符,所以把以lambda表達(dá)式定義的函數(shù)稱作匿名函數(shù)(AnonymousFunctions)。匿名函數(shù)與lambda表達(dá)式14/63例如,使用lambda表達(dá)式定義一個求得兩數(shù)之和的函數(shù),程序如下所示。案例:匿名函數(shù)的定義與使用15/63第5章函數(shù)與模塊5.2函數(shù)的參數(shù)傳遞

函數(shù)調(diào)用時,默認(rèn)按位置順序?qū)嶋H參數(shù)逐個傳遞給形式參數(shù),也就是調(diào)用時,傳遞的實際參數(shù)和函數(shù)定義時確定的形式參數(shù)在順序、個數(shù)上要一致,否則調(diào)用時會出現(xiàn)錯誤。函數(shù)定義時可以給形式參數(shù)賦予默認(rèn)值,即存在默認(rèn)參數(shù)值(DefaultArgumentValues)的情況,當(dāng)形式參數(shù)被指定了默認(rèn)值時,如果在函數(shù)調(diào)用中沒有給這個參數(shù)傳遞具體的值,就以默認(rèn)值作為該參數(shù)的實際參數(shù)。默認(rèn)參數(shù)值17/63例如,編寫程序定義一個重復(fù)輸出對象內(nèi)容的函數(shù),要求該函數(shù)包含2個參數(shù),第一個參數(shù)為需要輸出的對象,第二個參數(shù)為需要重復(fù)輸出的次數(shù),程序如下所示。函數(shù)調(diào)用的運行效果見下一頁案例:帶默認(rèn)參數(shù)值的函數(shù)定義18/63案例:以默認(rèn)參數(shù)值調(diào)用函數(shù)19/63那么,在實際使用過程中,如果遇到只希望對形式參數(shù)time進(jìn)行賦值的情況時,我們應(yīng)該如何對例5_6中定義的repeat()函數(shù)進(jìn)行調(diào)用呢?針對上述問題,Python提供了使用參數(shù)名而非參數(shù)位置進(jìn)行參數(shù)傳遞的方式,這種參數(shù)傳遞方式被稱為關(guān)鍵字參數(shù)(KeywordArguments),該方式要求程序在函數(shù)調(diào)用時以“形式參數(shù)名=實際參數(shù)值“的形式表明實際參數(shù)與形式參數(shù)的對應(yīng)關(guān)系。關(guān)鍵字參數(shù)20/63例如,以下對repeat()函數(shù)的調(diào)用形式表示將實際參數(shù)5賦值給形式參數(shù)time。案例:以關(guān)鍵字參數(shù)調(diào)用函數(shù)21/63Python還支持可變數(shù)量參數(shù)(VariadicArguments),也就是用一個形式參數(shù)接受不確定個數(shù)的實際參數(shù)。定義函數(shù)時,如果使用可變數(shù)量的參數(shù),需要在其參數(shù)名稱前放置一個星號*,其語法格式為:def函數(shù)名([參數(shù)1[,參數(shù)2…[,參數(shù)n]]][,*可變數(shù)量參數(shù)]):由上述格式可知,在可變數(shù)量參數(shù)之前,可能會出現(xiàn)零個或多個普通參數(shù),即當(dāng)普通參數(shù)接受完對應(yīng)的實際參數(shù)值之后,可變數(shù)量參數(shù)可以接受傳遞給函數(shù)的所有剩余實際參數(shù)??勺償?shù)量參數(shù)22/63例如,編寫程序完成以下功能的函數(shù)定義,要求該函數(shù)能夠統(tǒng)計某位同學(xué)各門課課程的平均分并輸出計算結(jié)果,其中第一個參數(shù)用于接受學(xué)生姓名,其后的所有參數(shù)均代表該同學(xué)的各門課成績。案例:定義可變數(shù)量參數(shù)23/63第5章函數(shù)與模塊5.3變量的作用域Python語言中,在程序不同位置被賦值的變量,它們在程序中可以被訪問的范圍也會不同。某個變量在程序中可以被正常訪問的范圍,被稱作該變量的作用域(Scope)。根據(jù)變量的作用域不同,將變量分為局部變量和全局變量。在函數(shù)內(nèi)部被賦值的變量(包括函數(shù)的形式參數(shù))是局部變量,它的作用域為當(dāng)前函數(shù)的函數(shù)體部分,函數(shù)體外的語句是無法訪問當(dāng)前函數(shù)中的局部變量的。局部變量25/63例如,編寫程序分別在不同位置輸出在函數(shù)體內(nèi)被賦值的變量,其程序如例5_8所示。運行效果見下頁:案例:輸出不同位置的變量26/63上述程序中,變量var在函數(shù)體內(nèi)被賦值,在函數(shù)fun()被調(diào)用時,程序可以正常輸出該變量的內(nèi)容,但是函數(shù)調(diào)用完畢后再次輸出變量var的內(nèi)容時,便會產(chǎn)生報錯,運行效果如下所示。案例:輸出不同位置的變量27/63為了防止在程序中訪問不存在的變量或者函數(shù)等對象,可以使用locals()函數(shù)查看當(dāng)前作用域中的標(biāo)識符名稱及其內(nèi)容,函數(shù)的語法格式為:locals()該函數(shù)的作用是返回當(dāng)前函數(shù)調(diào)用位置的局部作用域中,所有已經(jīng)定義的標(biāo)識符名稱以及這些標(biāo)識符關(guān)聯(lián)的對象內(nèi)容。內(nèi)置函數(shù)locals()28/63程序的運行結(jié)果如下:案例:locals()函數(shù)的使用29/63在Python程序文件的頂層結(jié)構(gòu)中被賦值的變量是全局變量,它的作用域是從該變量的賦值語句開始直到程序文件結(jié)束的全部范圍,即它可以被整個程序文件中該變量賦值語句之后的所有語句訪問。全局變量30/63例如,編寫程序輸出相同名稱的全局變量和局部變量的內(nèi)容,其程序如例5_11所示。運行結(jié)果如下:案例:同名變量的使用31/63與locals()函數(shù)類似,Python還提供了內(nèi)置函數(shù)globals(),用于在程序中查看可以全局訪問的標(biāo)識符名稱及其內(nèi)容,函數(shù)的語法格式為:globals()該函數(shù)的作用是返回當(dāng)前函數(shù)調(diào)用位置的全局作用域中,所有已經(jīng)定義的標(biāo)識符名稱以及這些標(biāo)識符關(guān)聯(lián)的對象內(nèi)容。內(nèi)置函數(shù)globals()32/63觀察上述程序的運行結(jié)果可知,無論在函數(shù)內(nèi)部,還是在程序的頂層結(jié)構(gòu)中,運行g(shù)lobal()函數(shù)都可以返回函數(shù)調(diào)用處可訪問的全局對象案例:globals()函數(shù)的使用33/63前兩節(jié)中介紹了局部變量和全局變量的使用方法,由此可知,在函數(shù)內(nèi)部被賦值的變量會被認(rèn)為是局部變量,如果需要在函數(shù)內(nèi)部對全局變量進(jìn)行賦值,就需要使用global關(guān)鍵字對其進(jìn)行聲明,其語法格式為:global標(biāo)識符1[,標(biāo)識符2…[,標(biāo)識符n]]上述語句將global關(guān)鍵字后的標(biāo)識符所對應(yīng)的內(nèi)容聲明為全局對象,包括變量、函數(shù)等。全局變量聲明與global語句34/63程序的運行結(jié)果如下:案例:聲明全局變量35/63第5章函數(shù)與模塊5.4函數(shù)的遞歸在一個函數(shù)內(nèi)部如果直接或者間接地出現(xiàn)了對該函數(shù)本身的調(diào)用,稱作函數(shù)的遞歸。函數(shù)的遞歸是一種常見的編程方法,適用于把一個大型復(fù)雜的問題逐層轉(zhuǎn)化為一個與原問題性質(zhì)相似,但規(guī)模較小的問題來求解的場景。函數(shù)遞歸37/63程序的運行結(jié)果如下:案例:使用函數(shù)遞歸求n的階乘38/63程序的運行結(jié)果如下:案例:使用函數(shù)遞歸求Fibonacci數(shù)列的第n項39/63第5章函數(shù)與模塊5.5模塊與包程序由一條條語句實現(xiàn),當(dāng)程序功能復(fù)雜,代碼行數(shù)很多時,如果不采取一定的組織方法,就會使程序的可讀性變差,后期也難以維護(hù)。

組織項目中的多個程序文件41/63程序由一條條語句實現(xiàn),當(dāng)程序功能復(fù)雜,代碼行數(shù)很多時,如果不采取一定的組織方法,就會使程序的可讀性變差,后期也難以維護(hù)。在Python中,代碼可以按如下方式一層層地組織起來。(1)使用函數(shù)將完成特定功能的代碼進(jìn)行封裝,然后通過函數(shù)的調(diào)用完成該功能。(2)將一個或幾個相關(guān)的函數(shù)保存為擴展名為.py的程序文件,構(gòu)成一個模塊(Modules)。導(dǎo)入模塊,就可以調(diào)用該模塊中定義的函數(shù)。(3)一個或多個模塊連同一個特殊的文件__init__.py保存在一個文件夾下,形成包(Packages)。包能方便地分層次組織模塊。組織項目中的多個程序文件42/63Python語言中,模塊就是文件名以.py為后綴的程序文件。例如,程序文件abc.py就是一個名為abc的模塊。在程序中導(dǎo)入模塊后,就可以調(diào)用定義在該模塊中的函數(shù),達(dá)到將函數(shù)內(nèi)的代碼進(jìn)行反復(fù)使用的目的。程序中如果要使用某個模塊中定義的變量或者函數(shù),首先要導(dǎo)入該模塊。模塊43/63導(dǎo)入模塊以及調(diào)用模塊中已經(jīng)定義好的函數(shù)的操作方法有兩種,如:導(dǎo)入模塊中函數(shù)的方法

方法一導(dǎo)入模塊的語法import模塊名1[as別名1]…[,模塊名nas別名n]函數(shù)調(diào)用的語法格式模塊名.函數(shù)名(實際參數(shù))在使用別名的情況下:別名.函數(shù)名(實際參數(shù))方法二導(dǎo)入模塊中函數(shù)的語法from模塊名import函數(shù)名1[as函數(shù)別名1]…[,函數(shù)名nas函數(shù)別名n]或者:from模塊名import*(導(dǎo)入模塊中定義的所有內(nèi)容)函數(shù)調(diào)用的語法格式函數(shù)名(實際參數(shù))在使用別名的情況下:函數(shù)別名(實際參數(shù))44/63上述函數(shù)的調(diào)用方式見后頁案例:編制函數(shù)并在其他模塊中調(diào)用45/63導(dǎo)入模塊或模塊中的對象時,可以使用別名:案例:調(diào)用其他模塊中的函數(shù)(方式一)46/63如果要在當(dāng)前程序中導(dǎo)入funs模塊中的所有內(nèi)容,也可以使用下方的語句來實現(xiàn)。其中,語句中的星號*,代表的就是該模塊中的所有內(nèi)容案例:調(diào)用其他模塊中的函數(shù)(方式二)47/63在不清楚模塊中都定義了哪些對象的時候,可以借助內(nèi)置函數(shù)dir()來幫忙,該函數(shù)的語法格式為:dir([object])其中,參數(shù)object就是待查詢的對象,函數(shù)運行后會返回對象object中定義的所有內(nèi)容。如果以沒有參數(shù)的形式調(diào)用dir()函數(shù),其運行后會返回當(dāng)前作用域中可訪問的所有對象名稱。內(nèi)置函數(shù)dir()48/63程序的運行結(jié)果如下:觀察上述運行結(jié)果可以發(fā)現(xiàn),除了函數(shù)fact()之外,還有一些以2個下劃線開始和結(jié)束的標(biāo)識符,這些標(biāo)識符所代表的的對象是每一個Python模塊都會有的通用屬性,比如代表當(dāng)前模塊的說明文字的標(biāo)識符__doc__、代表當(dāng)前模塊的文件路徑的標(biāo)識符__file__、代表當(dāng)前模塊名稱的標(biāo)識符__name__等。案例:查看模塊funs中定義的所有對象49/63特別需要注意的是代表當(dāng)前模塊名稱的標(biāo)識符__name__。當(dāng)一個模塊不是以導(dǎo)入的方式被運行,而是以一個單獨的模塊被運行時,其__name__屬性中的值為"__main__",例如編寫程序,在程序中輸入當(dāng)前模塊的__name__屬性,程序如例5_20所示。直接運行該程序的運行結(jié)果如下:這表示上述程序不是以導(dǎo)入的方式被運行的,而是作為一個單獨的模塊被Python解釋器直接運行的。反之,在交互方式中以導(dǎo)入模塊的方式運行該程序的結(jié)果如下所示。模塊的__name__屬性50/63利用模塊的__name__屬性的特殊性,可以完成一些有用的功能。例如編寫程序定義函數(shù)fact(n),要求該函數(shù)實現(xiàn)計算n的階乘的功能,并且當(dāng)該模塊并非以導(dǎo)入的方式被運行時,輸出5的階乘,該程序如例5_21所示。運行效果見下頁。案例:在非導(dǎo)入方式時運行的程序51/63上述程序在被直接運行時,會在屏幕上輸出5的階乘,效果如下所示。但是,如果該程序被import語句導(dǎo)入的話,由于if語句中的判定條件不成立,所以此時程序不輸出任何內(nèi)容,如果需要計算5的階乘,則需要另外輸入對函數(shù)fact()的調(diào)用語句,例如:案例:不同運行方式下的效果52/63包是Python引入的分層次的文件目錄結(jié)構(gòu),它定義了一個由模塊以及嵌套在包內(nèi)的包組成的多級層次的Python程序文件結(jié)構(gòu)。每個包的目錄中都會包含名為__init__.py的特殊文件,該文件中的程序會在導(dǎo)入包中對象的時候被運行,這個過程也被稱為包的初始化。雖然程序文件__init__.py的內(nèi)容可以為空,但是該文件必須存在,因為它表明這個目錄不是一個普通的文件目錄,而是Python語言中的包,其中會包含模塊或者嵌套在其中的包。包53/63上述描述中,所謂包的嵌套關(guān)系,就是在包中還可以包含包,對應(yīng)在文件系統(tǒng)中表示可以有多級目錄進(jìn)行嵌套,以組成多級層次的包結(jié)構(gòu)。同樣,嵌套在外層的包中的內(nèi)層的包,其中也都需要包含一個__init__.py文件。例如,構(gòu)建一個包含包的嵌套關(guān)系的Python程序文件結(jié)構(gòu),如圖所示。包的嵌套54/63在頂層目錄中包含名為例5_22.py的模塊,用于演示如何在頂層模塊中導(dǎo)入包含在模塊h1.py和h2.py中的函數(shù)定義程序的運行結(jié)果如下:案例:在頂層模塊中導(dǎo)入對象55/63第5章函數(shù)與模塊5.6常用的標(biāo)準(zhǔn)模塊Python中的模塊有3種:自定義模塊、標(biāo)準(zhǔn)模塊和第三方模塊。前面的章節(jié)已經(jīng)介紹了如何編寫自定義模塊,以及在自定義模塊中完成函數(shù)定義,并根據(jù)實際需要在程序中進(jìn)行函數(shù)調(diào)用。標(biāo)準(zhǔn)模塊是隨著Python安裝程序一并被裝入計算機的模塊,是Python運行的核心,提供了關(guān)于系統(tǒng)管理、網(wǎng)絡(luò)通信、文本處理等功能。大部分標(biāo)準(zhǔn)模塊的使用方法和用戶自定義模塊一樣,需要先使用import語句進(jìn)行導(dǎo)入,才可以使用模塊中定義的函數(shù)。但是包含在builtins模塊中的函數(shù)會被直接包含在Python解釋器中,所以無需導(dǎo)入builtins模塊便可以直接使用其中定義的函數(shù)。第三方模塊,也被稱為第三方程序庫,是在Python發(fā)展過程中針對各種領(lǐng)域,如科學(xué)計算、Web開發(fā)、數(shù)據(jù)庫接口、圖形系統(tǒng)等逐步形成的,需要獨立安裝后才可以在Python中使用。Python官網(wǎng)上給出了第三方模塊索引功能(thePythonPackageIndex,PyPI)。Python中的模塊57/63Python解釋器中直接包含了builtins模塊中定義的函數(shù),這些函數(shù)被稱為內(nèi)置函數(shù)。表5?2羅列出了一些常用的內(nèi)置函數(shù)及其功能,如果想了解這些內(nèi)置函數(shù)的相關(guān)細(xì)節(jié),可以查詢書中的對應(yīng)章節(jié)。內(nèi)建模塊builtinsabs()all()any()bin()bool()chr()complex()delattr()dict()dir()divmod()enumerate()eval()filter()float()format()frozenset()getattr()globals()hasattr()help()hex()id()input()int()isinstance()issubclass()len()list()locals()map()max()min()oct()open()ord()pow()print()range()reversed()round()set()setattr()sorted()str()sum()super()tu

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論