函數(shù)是一段可重復(fù)使用的、具有特定功能的語句塊,通過函數(shù)名來定義和調(diào)用。經(jīng)過定義,函數(shù)內(nèi)的語句塊成為一個(gè)整體,即“函數(shù)體”,可以通過使用函數(shù)名的調(diào)用從而實(shí)現(xiàn)函數(shù)內(nèi)部語句塊的重復(fù)使用。 在使用過程中,函數(shù)內(nèi)部對(duì)調(diào)用者來說可以是完全未知的黑箱,調(diào)用者只要知道函數(shù)應(yīng)該傳入的參數(shù)是什么、返回的參數(shù)是什么這兩點(diǎn)就可以無障礙調(diào)用。從此方面講,函數(shù)就具有“封裝”性。 使用函數(shù)最大的優(yōu)點(diǎn)是提高代碼的復(fù)用,并且可以進(jìn)行模塊化的程序設(shè)計(jì)。同樣功能的代碼多次使用,可以大幅的節(jié)省編程成本,提高編程效率,降低代碼編程難度。同時(shí),習(xí)慣使用函數(shù)編程,將實(shí)現(xiàn)不同功能的代碼寫成不同的函數(shù),便于將編程問題和具體需求進(jìn)一步細(xì)化,分而治之。 同一個(gè)程序的功能被劃分為不同的小的功能模塊,形成模塊化設(shè)計(jì)布局,不僅使得程序具有很好的可讀性,也便于程序的維護(hù)升級(jí)和兼容性提升。函數(shù)對(duì)內(nèi)部封裝的特性,使得只要在定義函數(shù)的部分更改其函數(shù)體的語句,就能實(shí)現(xiàn)該功能的升級(jí)維護(hù),整個(gè)程序中調(diào)用該函數(shù)的部分也會(huì)得到更新。 1.基本使用函數(shù)的使用可以包括四個(gè)步驟,即函數(shù)定義、函數(shù)調(diào)用、函數(shù)執(zhí)行、函數(shù)返回。其中函數(shù)的定義部分尤為重要,其直接決定了函數(shù)應(yīng)該怎么調(diào)用、函數(shù)的執(zhí)行過程如何、函數(shù)返回什么值等等。 Python語言通過保留字def定義函數(shù),語法形式如下:
函數(shù)名可以是任何P有效的Python標(biāo)識(shí)符。 參數(shù)列表是調(diào)用該函數(shù)時(shí)傳入給函數(shù)的值,可以是某個(gè)數(shù)據(jù)類型的單個(gè)參數(shù),也可以是一個(gè)很多數(shù)據(jù)類型組成的參數(shù)列表,還可以沒有任何參數(shù)(沒有參數(shù)時(shí),括號(hào)也不可以省略),視函數(shù)編寫者的設(shè)計(jì)而定。參數(shù)列表以逗號(hào)分隔即可。 函數(shù)體則由具體的Python代碼塊組成,與前面學(xué)的普通Python代碼沒有任何差異,該代碼塊需要根據(jù)參數(shù)列表執(zhí)行特定操作。 返回值列表是函數(shù)傳出的參數(shù),由return保留字建立,該列表也同參數(shù)列表一樣,可以是任何的數(shù)據(jù)類型和任意數(shù)量大小的列表。當(dāng)返回值列表的元素大小為0時(shí),函數(shù)的執(zhí)行只是對(duì)程序進(jìn)行代碼塊的操作,不返回任何值,return需要省略。 函數(shù)的調(diào)用,通過函數(shù)名來調(diào)用函數(shù)功能,對(duì)函數(shù)的各個(gè)參數(shù)賦予實(shí)際值,實(shí)際值可以是實(shí)際的數(shù)據(jù)值,也可以是在調(diào)用函數(shù)前已經(jīng)定義過的變量。 函數(shù)的執(zhí)行,是參數(shù)傳入以后,程序執(zhí)行函數(shù)體功能代碼的過程,其執(zhí)行過程由函數(shù)體的代碼決定。 函數(shù)返回,函數(shù)執(zhí)行完畢后,函數(shù)將返回值列表返回到程序,并將控制權(quán)返回給程序。 函數(shù)定義及調(diào)用演示如下:
函數(shù)的函數(shù)體一定需要書寫至少一行的代碼,當(dāng)不希望函數(shù)做任何事時(shí),可以使用pass保留字。保留字pass表示不進(jìn)行任何操縱,起到占位的作用。演示如下:
編程中大量使用函數(shù)已經(jīng)成為一種編程范式,叫做函數(shù)式編程。函數(shù)式編程的主要思想是把程序過程盡量寫成一系列函數(shù)調(diào)用,這樣能夠使代碼編寫的更簡(jiǎn)潔易讀,是中小規(guī)模軟件最常用的編程方式。 在Python中,函數(shù)也是有類型的,可以通過type()函數(shù)來獲得函數(shù)類型。函數(shù)類型是Python的內(nèi)置類型,具體為function類型。當(dāng)用type()檢查調(diào)用的函數(shù)的類型時(shí),返回的是函數(shù)返回值的類型。即函數(shù)調(diào)用優(yōu)先執(zhí)行,當(dāng)函數(shù)執(zhí)行完畢,函數(shù)將返回值和控制權(quán)返回給程序,type()函數(shù)檢驗(yàn)的就不再是函數(shù),而是返回值了。 2.參數(shù)傳遞定義函數(shù)時(shí)參數(shù)列表中的參數(shù),是形參數(shù),沒有實(shí)際意義。調(diào)用函數(shù)時(shí)傳入的參數(shù)是實(shí)參,由出傳入的參數(shù)賦予形參意義來執(zhí)行程序。 函數(shù)的參數(shù)傳遞可以分為三種情況:可選的參數(shù)傳遞、參數(shù)名稱傳遞、函數(shù)的返回值。其中可選的參數(shù)傳遞是指,在傳入?yún)?shù)進(jìn)函數(shù)時(shí),可以省略掉一些參數(shù),省略的參數(shù)用事先規(guī)定的默認(rèn)值代替?zhèn)魅牒瘮?shù)。演示如下:
根據(jù)編程習(xí)慣,一般情況下參數(shù)列表都是先寫非可選參數(shù),可選參數(shù)放在后面。可選參數(shù)放在前面會(huì)報(bào)錯(cuò),親測(cè)。 參數(shù)傳入函數(shù)還有另一種方法,即通過參數(shù)名稱直接賦予形參意義。使用參數(shù)名稱傳入?yún)?shù)給函數(shù),對(duì)參數(shù)的順序沒有要求。演示如下:
函數(shù)執(zhí)行完畢,有可能需要對(duì)程序傳出一些返回值列表,具體由return而定。返回值可以是0個(gè),1個(gè),多個(gè)。當(dāng)返回多個(gè)參數(shù)時(shí),這些參數(shù)形成了一個(gè)元組數(shù)據(jù)類型,由小括號(hào)和逗號(hào)分隔。例如(a,b,c)。元組和函數(shù)、整數(shù)、字符串等一樣,是Python內(nèi)置的數(shù)據(jù)類型,我們將在后續(xù)的課程中慢慢討論。 函數(shù)可以沒有返回值,當(dāng)返回值是多個(gè)的時(shí)候,可以使用多個(gè)變量將返回值依次賦值給這些變量,在上例中已經(jīng)演示過,不再重復(fù)演示。 3.變量作用域根據(jù)程序中變量的所在位置和作用范圍,可以將其分為全局變量和局部變量。全局變量值橫跨多個(gè)函數(shù),在整個(gè)程序中存在并發(fā)揮作用的變量;而局部變量則是指在一個(gè)函數(shù)的內(nèi)部存在,并只作用于這個(gè)函數(shù)內(nèi)部,函數(shù)執(zhí)行完畢后便被內(nèi)存釋放,不在存在的變量。 例如如下代碼:
在函數(shù)內(nèi)使用全局變量需要使用global保留字。使用方法如下: global <全局變量名> 演示代碼如下:
使用global保留字聲明變量的作用域是Python語言中少有的需要再次聲明的情形,由于作用域不同,這種聲明不能省略。 4.代碼復(fù)用函數(shù)是程序的一種基本抽象方式,它將一系列代碼組織起來通過命名供其他程序使用。這種封裝的最直接好處就是能夠很好的實(shí)現(xiàn)代碼復(fù)用。當(dāng)需要頻繁的使用某種操作或是功能時(shí),將這種操作或功能編寫成函數(shù)封裝起來,需要用的時(shí)候直接調(diào)用函數(shù)而不需要將該功能再寫一遍,大大提高了編程效率。 以函數(shù)式編程為基礎(chǔ)的模塊化設(shè)計(jì)程序,就是通過函數(shù)的封裝功能將程序劃分為主程序和若干子程序,通過主程序和子程序之間的關(guān)系,將各個(gè)獨(dú)立的功能程序組成一個(gè)有機(jī)可可協(xié)同的整體程序。因此,模塊化設(shè)計(jì)以功能塊為基本單位,一般有兩個(gè)基本要求: 緊耦合:盡可能合理劃分功能塊,各個(gè)功能塊內(nèi)部耦合緊密。 松耦合:模塊間關(guān)系盡可能簡(jiǎn)單,各個(gè)功能塊之間耦合松散。 在編程中,耦合性指程序結(jié)構(gòu)中各模塊相互關(guān)聯(lián)的程度,它取決于各模塊間接口(即實(shí)現(xiàn)模塊相連的入口,能體現(xiàn)兩個(gè)功能模塊之間的關(guān)系)的復(fù)雜程度和調(diào)用方式。耦合性是影響軟件復(fù)雜程度和設(shè)計(jì)質(zhì)量的一個(gè)重要因素。緊耦合指模塊或系統(tǒng)間關(guān)系緊密,存在較多或復(fù)雜的相互調(diào)用,緊耦合的缺點(diǎn)在于更新一個(gè)模塊可能導(dǎo)致其他模塊變化,復(fù)用較困難。松耦合一般基于消息或協(xié)議實(shí)現(xiàn),系統(tǒng)間交互簡(jiǎn)單。 松耦合代表了模塊化,從系統(tǒng)觀點(diǎn)來看,松耦合是程序的總體設(shè)計(jì)原則,也是函數(shù)使用的重要指導(dǎo)。 使用函數(shù)只是模塊化設(shè)計(jì)的必要非充分條件,根據(jù)計(jì)算需求合理劃分函數(shù)十分重要。一般來說,完成特定功能或被經(jīng)常復(fù)用的一組語句應(yīng)該采用函數(shù)來封裝,并盡可能減少函數(shù)間參數(shù)和返回值的數(shù)量。 |
|