Python編程:輕松掌握函數(shù)定義、類型及其參數(shù)傳遞方式
前言
本文帶你輕松理解并掌握Python語言中的核心特性——函數(shù):定義語法以及函數(shù)形式,并介紹函數(shù)的參數(shù)傳遞的兩種方式。
函數(shù)含義
函數(shù)(function)是執(zhí)行特定任務(wù)的語句塊,是允許程序員重用的部分代碼,其促進(jìn)了軟件程序的模塊化概念。這種方法背后的主要思想是將一個(gè)大的代碼塊劃分為更小的獨(dú)立部分,也因此更易于管理的子塊。Python中有兩種類型的函數(shù):
內(nèi)置函數(shù)(Build-in):編程時(shí)可以在程序中直接使用這些函數(shù)而無需定義它們。這種類型的函數(shù)在一開的始學(xué)習(xí)中經(jīng)常使用了(例如,print()、input()、sum()等)。
用戶定義函數(shù)(User-defined):Python允許程序員創(chuàng)建自己的函數(shù)。接下來將重點(diǎn)介紹這種特定的函數(shù)類型。
簡(jiǎn)而言之,函數(shù)就是定義好的且可以重復(fù)調(diào)用的結(jié)構(gòu)化語句塊。函數(shù)名稱唯一,可接收參數(shù),并且根據(jù)需要返回給調(diào)用者相應(yīng)的結(jié)果(值),或不返回值。
函數(shù)定義
在Python中定義函數(shù)的主要規(guī)則如下:
- 函數(shù)塊以關(guān)鍵字def開始,后面跟著函數(shù)名和括號(hào)。注意,由于Python是區(qū)分大小寫的,所以必須使用def而不是Def。
- 與變量名類似,函數(shù)名可以包含字母或數(shù)字,但不包含空格或特殊字符,且不能以數(shù)字開頭。
- 可選的輸入?yún)?shù)(稱為arguments)應(yīng)放在括號(hào)內(nèi)——參數(shù)數(shù)量和類型根據(jù)需要來。
- 函數(shù)名后跟冒號(hào),通常函數(shù)中的語句塊從冒號(hào)后換行開始并縮進(jìn)。
- 返回?cái)?shù)據(jù)的函數(shù)必須在其代碼塊中包含關(guān)鍵字return。
概括起來,有四種類型的函數(shù):
- 無參數(shù)無返回值型函數(shù);
- 有參數(shù)無返回值型函數(shù);
- 無參數(shù)有返回值型函數(shù);
- 有參數(shù)有返回值型函數(shù)。
函數(shù)定義的語法格式如下:
根據(jù)實(shí)參的存在與否以及輸入和/或返回值的存在情況,函數(shù)可以分為上面的四種可能的類型。下面將分別介紹。
無參無返回值型函數(shù)
在這種類型中,函數(shù)不接受變量作為參數(shù),也不返回任何數(shù)據(jù)。比如下面的腳本演示即為這種函數(shù),它只在屏幕上打印預(yù)定義的字符串。
代碼顯而易見,定義中形參,調(diào)用時(shí)沒有實(shí)參,語句塊中也沒有return語句。該結(jié)構(gòu)只是調(diào)用print()函數(shù)來顯示所需的消息。在主程序中調(diào)用這樣一個(gè)函數(shù)是一個(gè)相當(dāng)簡(jiǎn)單直接,如下所示:
運(yùn)行程序后輸出結(jié)果為:
有參無返回值型函數(shù)
另一種類型的函數(shù)接受變量作為參數(shù),但不返回任何數(shù)據(jù)。在下面的示例中,通過聲明的名稱來調(diào)用函數(shù),同時(shí)在所調(diào)用的函數(shù)括號(hào)中包含一些值。這些值被傳遞給函數(shù)的主體使用,可以被視為普通變量:
運(yùn)行程序,結(jié)果類似如下:
無參有返回值型函數(shù)
第三種類型為不接受參數(shù)但有返回?cái)?shù)據(jù)的函數(shù)。重要的是要記住,因?yàn)檫@種類型的函數(shù)返回的一個(gè)值給調(diào)用代碼,這個(gè)值必須在被使用或處理之前賦值給一個(gè)變量。示例如下:
運(yùn)行程序結(jié)果類似如下:
有參有返回值型函數(shù)
這種類型函數(shù)既接受參數(shù),又將值返回給調(diào)用代碼。情況下面示例。在這種情況下,函數(shù)的調(diào)用必須包含一個(gè)參數(shù)列表,并將返回值賦給一個(gè)特定的變量以供以后使用:
運(yùn)行程序結(jié)果類似如下:
函數(shù)參數(shù)傳遞方式
有兩種不同的方法用來給函數(shù)傳遞參數(shù)。確定選擇兩者的哪個(gè)方法應(yīng)取決于原來變量的值是否可在函數(shù)內(nèi)更改。將參數(shù)值傳遞給函數(shù)有兩種方法,通常被稱為按值調(diào)用/傳遞(call/pass by value)和按引用調(diào)用/傳遞(call/pass by reference)。
概要來說,函數(shù)參數(shù)傳遞:
其一,按值方式:參數(shù)是原始變量的副本,保持副本且不改變?cè)贾担?/p>
其二,按引用方式:改變直接作用于原始變量,因此也就改變了原始值。
按值調(diào)用/傳遞
在這種情況下,實(shí)參(形參)的值作為原始變量的副本處理。因此,當(dāng)程序控制返回給調(diào)用者時(shí),調(diào)用者作用域中的原始變量將保持不變。
在Python中,如果將不可變參數(shù)(例如,整數(shù)和字符串)傳遞給函數(shù),通常的做法是按值調(diào)用/傳遞參數(shù)。下面的示例通過介紹id()函數(shù)說明了這種情況。它接受一個(gè)對(duì)象作為參數(shù)(即id(object)),并返回這個(gè)特定對(duì)象的標(biāo)識(shí)。Id()返回值是一個(gè)整數(shù),它在對(duì)象的生命周期內(nèi)是惟一的和永久的。如示例所示,在調(diào)用checkParamemterID函數(shù)之前,變量x的id為4564813232。需要注意的是,只要x的值沒有更新,x的id在函數(shù)中就不會(huì)改變。但是,一旦該值更新為20,其對(duì)應(yīng)的id將更改為4564813552。需要注意的最重要的一點(diǎn)是,x的id在調(diào)用函數(shù)后不會(huì)改變,它的原始值保持不變(4564813232)。這意味著對(duì)x值的更改應(yīng)用于變量的副本,而不是調(diào)用者作用域內(nèi)的原始變量。
示例代碼如下:
運(yùn)行輸出結(jié)果類似如下:
按引用調(diào)用/傳遞
在這種情況下,函數(shù)獲取實(shí)參(即原始變量)的引用,而不是它的副本。如果函數(shù)內(nèi)發(fā)生更改,則調(diào)用者作用域中原始變量的值也將被修改。在Python中,如果可變參數(shù)(如列表)傳遞給函數(shù),則調(diào)用/傳遞是通過引用進(jìn)行的。如下所示,updateList將值5追加到名為y的列表中。即原始可變變量x的值發(fā)生了變化,這證明函數(shù)按引用調(diào)用/傳遞參數(shù)的特征。示例代碼如下:
運(yùn)行程序輸出結(jié)果類似如下:
本文小結(jié)
本期內(nèi)容介紹了函數(shù)的基本內(nèi)容和實(shí)現(xiàn)語法,以及參數(shù)傳遞、有無參數(shù)和返回值的函數(shù)形式以及函數(shù)調(diào)用/傳遞的實(shí)現(xiàn)。