官术网_书友最值得收藏!

1.6 函數(shù)

函數(shù)是程序中可重復(fù)使用的代碼段,用來(lái)實(shí)現(xiàn)單一的或相關(guān)聯(lián)的功能。

可以給一段程序起一個(gè)名字,用這個(gè)名字來(lái)執(zhí)行一個(gè)操作,反復(fù)使用(調(diào)用函數(shù)),這就是函數(shù)的基本含義。

基本上所有的高級(jí)語(yǔ)言都支持函數(shù),Python也不例外。Python不但能非常靈活地定義函數(shù),而且本身內(nèi)置了很多有用的函數(shù),可以直接調(diào)用,如用于輸入輸出的函數(shù)input()、print()等。除此之外,我們也可以創(chuàng)建函數(shù),即用戶自定義函數(shù)。

Python中的函數(shù)分3類(lèi)。

(1)自定義函數(shù):由程序員自己編寫(xiě)的函數(shù)。

(2)標(biāo)準(zhǔn)庫(kù)函數(shù):通過(guò)import指令調(diào)用標(biāo)準(zhǔn)庫(kù),然后使用其函數(shù)。

(3)內(nèi)置函數(shù):如前面介紹的input()、print()、eval()等函數(shù)。

下面主要介紹自定義函數(shù)和函數(shù)參數(shù)傳遞等相關(guān)知識(shí)。

1.6.1 函數(shù)的定義

1.自定義函數(shù)的語(yǔ)法格式

說(shuō)明:

(1)函數(shù)使用關(guān)鍵字(保留字)def聲明。注意:“def”只能是小寫(xiě)字母!

(2)函數(shù)名必須使用有效的標(biāo)識(shí)符(以字母或下劃線開(kāi)頭的字母數(shù)字串,只能以字母或下劃線開(kāi)頭)。

(3)參數(shù)列表中的參數(shù)為形式參數(shù),多個(gè)參數(shù)之間用逗號(hào)隔開(kāi)(可以沒(méi)有參數(shù),此時(shí)稱為無(wú)參函數(shù),即使沒(méi)有參數(shù),小括號(hào)也不能省略)。

(4)函數(shù)可以使用 return 返回值,若函數(shù)體中包含 return 語(yǔ)句,則返回值,可以返回一個(gè)值,也可以返回多個(gè)值(實(shí)際上返回的是元組);如果沒(méi)有return或者return后無(wú)返回表達(dá)式,則都返回“None”。

(5)通常使用三個(gè)單引號(hào)'''…'''來(lái)注釋說(shuō)明函數(shù)的作用。函數(shù)體里的內(nèi)容不可為空,如果想定義一個(gè)什么都不做的空函數(shù),可用 pass 語(yǔ)句。空語(yǔ)句 pass 起占位的作用,經(jīng)常會(huì)在剛開(kāi)始定義函數(shù)的時(shí)候用它來(lái)占位,今后進(jìn)行具體操作的時(shí)候再來(lái)進(jìn)行修改。

上述代碼中,缺少pass空語(yǔ)句會(huì)出錯(cuò)。

2.自定義函數(shù)的示例

【例1-23】 沒(méi)有參數(shù)和返回值的函數(shù)。

當(dāng)調(diào)用 help(say_hi)時(shí),可以查看自定義函數(shù)中用三引號(hào)注釋的內(nèi)容(用#注釋的內(nèi)容無(wú)法查看)。

【例1-24】 用help(say_hi)查看自定義函數(shù)的注釋內(nèi)容。

注意:Python 是一門(mén)完全依賴于縮進(jìn)的語(yǔ)言!它不用分號(hào)等作為每個(gè)語(yǔ)句的結(jié)束。

【例1-25】 請(qǐng)寫(xiě)出一個(gè)自定義函數(shù),用來(lái)求一個(gè)數(shù)的平方。

輸出語(yǔ)句不要放在自定義函數(shù)中,每個(gè)模塊只實(shí)現(xiàn)一個(gè)功能就好。

如果在上面的例子中,把自定義函數(shù)體中的 return 語(yǔ)句進(jìn)行如下修改,請(qǐng)觀察得到的結(jié)果。

如果return后無(wú)表達(dá)式,則返回的是“None”空類(lèi)型。

如果自定義函數(shù)中無(wú)return語(yǔ)句,則返回的還是“None”空類(lèi)型。

3.Python中函數(shù)和方法的異同點(diǎn)

函數(shù)可以看成一個(gè)數(shù)學(xué)上的概念,比如說(shuō)完成加、減、乘、除的函數(shù)。它其實(shí)有一個(gè)內(nèi)在的約束,就是如果參數(shù)相同,對(duì)一個(gè)函數(shù)的每次調(diào)用返回的結(jié)果應(yīng)該始終是一樣的。

方法是與某個(gè)對(duì)象相互關(guān)聯(lián)的,也就是說(shuō)它的實(shí)現(xiàn)與某個(gè)對(duì)象有關(guān)聯(lián)關(guān)系。方法的定義方式和函數(shù)是一樣的,在Class中定義的函數(shù)就是方法。

1.6.2 函數(shù)的調(diào)用

1.函數(shù)調(diào)用的語(yǔ)法格式

說(shuō)明:

(1)函數(shù)名是已經(jīng)定義好的函數(shù)名稱,即遵循先定義后使用的原則。

(2)調(diào)用函數(shù)的實(shí)參列表必須與定義函數(shù)時(shí)的形參列表一一對(duì)應(yīng),包括參數(shù)的個(gè)數(shù)、類(lèi)型等,否則程序會(huì)報(bào)錯(cuò)。

2.參數(shù)傳遞

1)默認(rèn)參數(shù)

如果在定義函數(shù)的時(shí)候,指定了參數(shù)的值,而在調(diào)用函數(shù)時(shí)不指明所有參數(shù)的值,則沒(méi)有指明的參數(shù)就使用它的默認(rèn)值。

【例1-26】 默認(rèn)參數(shù)示例。

說(shuō)明:默認(rèn)參數(shù)后不能再出現(xiàn)非默認(rèn)參數(shù)。示例如下:

(1)f(a,b=2) 這樣定義合法!

(2)f(b=2,a) 這樣定義非法!因?yàn)樵谀J(rèn)參數(shù)后又出現(xiàn)了非默認(rèn)參數(shù)a。

默認(rèn)參數(shù)指的是在定義函數(shù)時(shí)指定了值的參數(shù)。如上例中,在定義函數(shù) repeat_str(s,times=1)時(shí),指定了參數(shù) times 的值為 1,這時(shí)就稱參數(shù) times 為默認(rèn)參數(shù)。在參數(shù)times后不能再出現(xiàn)非默認(rèn)參數(shù)了!

2)關(guān)鍵字參數(shù)

關(guān)鍵字參數(shù),在調(diào)用函數(shù)時(shí)有時(shí)希望只給部分參數(shù)傳值,這時(shí)就要用到關(guān)鍵字參數(shù)。示例如下:

在上面的示例中,只給參數(shù)a、b傳值是可以的,此時(shí)參數(shù)c使用默認(rèn)值8;但如果要給a、c傳值,b使用默認(rèn)值4,這時(shí)就必須使用關(guān)鍵字參數(shù)。

關(guān)鍵字參數(shù)指的是在調(diào)用函數(shù)時(shí),明確指明其值的參數(shù),如上面調(diào)用函數(shù)“func(125,c=24)”時(shí)指明了參數(shù)c的值為24,這里的參數(shù)c就稱為關(guān)鍵字參數(shù)。由于關(guān)鍵字參數(shù)指明了它的值為多少,因此,它的位置就沒(méi)有那么重要了。

請(qǐng)注意區(qū)分這兩個(gè)概念:默認(rèn)參數(shù)是定義函數(shù)時(shí)出現(xiàn)在參數(shù)表中的參數(shù)(形參),而關(guān)鍵字參數(shù)是在調(diào)用函數(shù)時(shí)出現(xiàn)在參數(shù)表中的參數(shù)(實(shí)參)。

3.變量作用域

在Python程序中創(chuàng)建、查找變量名時(shí),都是在一個(gè)保存變量名的空間中進(jìn)行的,我們稱之為命名空間,也稱為作用域。Python 變量的作用域是靜態(tài)的,在源代碼中變量名被賦值的位置決定了該變量能被訪問(wèn)的范圍(Python 中的變量不需要定義,在被賦值的時(shí)候就創(chuàng)建了一個(gè)變量指向值對(duì)象)。變量聲明的位置不同則被訪問(wèn)的范圍不同。變量的作用域分為三種:全局變量、局部變量和類(lèi)成員變量。這里,我們主要介紹兩種最基本的變量作用域,全局變量和局部變量[9]

1)全局變量和局部變量

定義在函數(shù)內(nèi)部的變量(注意:這里說(shuō)的是“定義”,而不是一般的“使用”,見(jiàn)下面的示例),只能在其被聲明的函數(shù)內(nèi)部被訪問(wèn)。全局變量可以在整個(gè)程序范圍內(nèi)被訪問(wèn),而局部變量只能在某個(gè)局部區(qū)域范圍內(nèi)被訪問(wèn)。

2)示例

【例1-27】 理解全局變量和局部變量。

在函數(shù)內(nèi)部聲明的變量,除非特別聲明為全局變量,否則均默認(rèn)為局部變量。有些情況需要在函數(shù)內(nèi)部定義全局變量,這時(shí)可以使用關(guān)鍵字 global 來(lái)聲明變量的作用域?yàn)槿址秶?/p>

【例1-28】 利用關(guān)鍵字global在函數(shù)內(nèi)部聲明全局變量。

1.6.3 lambda函數(shù)

Python 中用戶自定義函數(shù)有兩種方法,第一種是 1.5.1 節(jié)介紹的用 def 來(lái)定義,這種定義方式要明確指出函數(shù)的名字。第二種是通過(guò)保留字 lambda 來(lái)定義,這種定義方式不需要指定函數(shù)名,叫作匿名函數(shù),也稱為lambda函數(shù)。其語(yǔ)法格式為:

說(shuō)明:冒號(hào)“:”前面是逗號(hào)分隔的參數(shù)列表,之后的表達(dá)式的值是所定義的函數(shù)的返回值,由于lambda函數(shù)只能返回一個(gè)值,所以不用寫(xiě)return。

lambda 函數(shù)主要適用于定義簡(jiǎn)單的、能夠在一行內(nèi)表示的函數(shù),用在函數(shù)式編程中時(shí)通常省略<函數(shù)名>,即支持函數(shù)作為參數(shù)。請(qǐng)看下面的例子。

【例1-29】 將列表中的元素按照絕對(duì)值大小進(jìn)行排序。

【例1-30】 含單個(gè)參數(shù)的lambda函數(shù)。

【例1-31】 含多個(gè)參數(shù)的lambda函數(shù)。

主站蜘蛛池模板: 务川| 塔城市| 嵊泗县| 宕昌县| 方山县| 扬州市| 宁明县| 广汉市| 株洲市| 长垣县| 平陆县| 镇巴县| 新干县| 东乡| 安岳县| 遂昌县| 丹凤县| 祁阳县| 清河县| 锦屏县| 保靖县| 运城市| 新化县| 扎囊县| 南康市| 方城县| 赣榆县| 垫江县| 嘉峪关市| 青冈县| 汝城县| 周至县| 公主岭市| 武城县| 封丘县| 阜阳市| 曲松县| 治多县| 长治县| 泰来县| 大厂|