- Python程序設(shè)計(jì)
- 張雪萍主編
- 2393字
- 2019-06-19 15:48:25
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ù)。

- Learning Cython Programming
- 解構(gòu)產(chǎn)品經(jīng)理:互聯(lián)網(wǎng)產(chǎn)品策劃入門(mén)寶典
- Python從菜鳥(niǎo)到高手(第2版)
- Python高級(jí)機(jī)器學(xué)習(xí)
- 信息安全技術(shù)
- Python編程:從入門(mén)到實(shí)踐
- Python圖形化編程(微課版)
- Learning Material Design
- Kotlin極簡(jiǎn)教程
- Python程序設(shè)計(jì)開(kāi)發(fā)寶典
- 從0到1:HTML5 Canvas動(dòng)畫(huà)開(kāi)發(fā)
- Python Programming for Arduino
- 青少年學(xué)Python(第2冊(cè))
- Java 9 with JShell
- Python機(jī)器學(xué)習(xí)開(kāi)發(fā)實(shí)戰(zhàn)