前言
本文帶你輕松理解并掌握Python語(yǔ)言中的核心特性——函數:定義語(yǔ)法以及函數形式,并介紹函數的參數傳遞的兩種方式。閑話(huà)少敘,開(kāi)始——記得關(guān)注@傳新視界 ,點(diǎn)個(gè)贊 分享給更多的朋友。
Python函數
函數含義
函數(function)是執行特定任務(wù)的語(yǔ)句塊,是允許程序員重用的部分代碼,其促進(jìn)了軟件程序的模塊化概念。這種方法背后的主要思想是將一個(gè)大的代碼塊劃分為更小的獨立部分,也因此更易于管理的子塊。Python中有兩種類(lèi)型的函數:
內置函數(Build-in):編程時(shí)可以在程序中直接使用這些函數而無(wú)需定義它們。這種類(lèi)型的函數在一開(kāi)的始學(xué)習中經(jīng)常使用了(例如,print()、input()、sum()等)。
用戶(hù)定義函數(User-defined):Python允許程序員創(chuàng )建自己的函數。接下來(lái)將重點(diǎn)介紹這種特定的函數類(lèi)型。
簡(jiǎn)而言之,函數就是定義好的且可以重復調用的結構化語(yǔ)句塊。函數名稱(chēng)唯一,可接收參數,并且根據需要返回給調用者相應的結果(值),或不返回值。
函數定義
在Python中定義函數的主要規則如下:
函數塊以關(guān)鍵字def開(kāi)始,后面跟著(zhù)函數名和括號。注意,由于Python是區分大小寫(xiě)的,所以必須使用def而不是Def。與變量名類(lèi)似,函數名可以包含字母或數字,但不包含空格或特殊字符,且不能以數字開(kāi)頭??蛇x的輸入參數(稱(chēng)為arguments)應放在括號內——參數數量和類(lèi)型根據需要來(lái)。函數名后跟冒號,通常函數中的語(yǔ)句塊從冒號后換行開(kāi)始并縮進(jìn)。返回數據的函數必須在其代碼塊中包含關(guān)鍵字return。
概括起來(lái),有四種類(lèi)型的函數:
無(wú)參數無(wú)返回值型函數;有參數無(wú)返回值型函數;無(wú)參數有返回值型函數;有參數有返回值型函數。
函數定義的語(yǔ)法格式如下:
deffunctionName(var1, var2, … etc.):Statements
根據實(shí)參的存在與否以及輸入和/或返回值的存在情況,函數可以分為上面的四種可能的類(lèi)型。下面將分別介紹。
無(wú)參無(wú)返回值型函數
在這種類(lèi)型中,函數不接受變量作為參數,也不返回任何數據。比如下面的腳本演示即為這種函數,它只在屏幕上打印預定義的字符串。
代碼顯而易見(jiàn),定義中形參,調用時(shí)沒(méi)有實(shí)參,語(yǔ)句塊中也沒(méi)有return語(yǔ)句。該結構只是調用print()函數來(lái)顯示所需的消息。在主程序中調用這樣一個(gè)函數是一個(gè)相當簡(jiǎn)單直接,如下所示:
定義一個(gè)既無(wú)參數也無(wú)返回值的函數defprintSomething():print(Hello world)在主程序中直接調用printSomething()
運行程序后輸出結果為:
Hello world
有參無(wú)返回值型函數
另一種類(lèi)型的函數接受變量作為參數,但不返回任何數據。在下面的示例中,通過(guò)聲明的名稱(chēng)來(lái)調用函數,同時(shí)在所調用的函數括號中包含一些值。這些值被傳遞給函數的主體使用,可以被視為普通變量:
定義接收參數但無(wú)返回值的函數defprintMyName(fName, lName):print(Your name is:, fName, lName)提示用戶(hù)輸入姓名firstName = input(Enter your first name:)
lastName = input(Enter your last name:)在主程序中調用所定義的函數printMyName(firstName, lastName)
運行程序,結果類(lèi)似如下:
Enter your first name:Solo
Enter your last name: Cui
Your name is: Solo Cui
無(wú)參有返回值型函數
第三種類(lèi)型為不接受參數但有返回數據的函數。重要的是要記住,因為這種類(lèi)型的函數返回的一個(gè)值給調用代碼,這個(gè)值必須在被使用或處理之前賦值給一個(gè)變量。示例如下:
定義無(wú)參數但有返回值的函數defreturnFloatNumber():inputFloat = float(input(輸入一個(gè)數字,其將返回給主程序:))returninputFloat主程序調用函數并顯示輸入結果x = returnFloatNumber()
print(輸入的數字為:, x)
運行程序結果類(lèi)似如下:
輸入一個(gè)數字,其將返回給主程序: 5.7
輸入的數字為:: 5.7
有參有返回值型函數
這種類(lèi)型函數既接受參數,又將值返回給調用代碼。情況下面示例。在這種情況下,函數的調用必須包含一個(gè)參數列表,并將返回值賦給一個(gè)特定的變量以供以后使用:
有參有返回值函數defcalculateSum(number1, number2):print(計算兩個(gè)數字和.)return(number1 number2)接受用戶(hù)輸入的兩個(gè)數字num1 = float(input(輸入第一個(gè)數字:))
num2 = float(input(輸入第二個(gè)數字:))調用函數計算倆個(gè)數字和addNumbers = calculateSum(num1, num2)輸出兩個(gè)數字和print(兩個(gè)數字和為:, addNumbers)
運行程序結果類(lèi)似如下:
輸入第一個(gè)數字: 3
輸入第二個(gè)數字: 5
計算兩個(gè)數字和...
兩個(gè)數字和為:: 8.0
函數參數傳遞方式
有兩種不同的方法用來(lái)給函數傳遞參數。確定選擇兩者的哪個(gè)方法應取決于原來(lái)變量的值是否可在函數內更改。將參數值傳遞給函數有兩種方法,通常被稱(chēng)為按值調用/傳遞(call/pass by value)和按引用調用/傳遞(call/pass by reference)。
概要來(lái)說(shuō),函數參數傳遞:
其一,按值方式:參數是原始變量的副本,保持副本且不改變原始值;
其二,按引用方式:改變直接作用于原始變量,因此也就改變了原始值。
按值調用/傳遞
在這種情況下,實(shí)參(形參)的值作為原始變量的副本處理。因此,當程序控制返回給調用者時(shí),調用者作用域中的原始變量將保持不變。
在Python中,如果將不可變參數(例如,整數和字符串)傳遞給函數,通常的做法是按值調用/傳遞參數。下面的示例通過(guò)介紹id()函數說(shuō)明了這種情況。它接受一個(gè)對象作為參數(即id(object)),并返回這個(gè)特定對象的標識。Id()返回值是一個(gè)整數,它在對象的生命周期內是惟一的和永久的。如示例所示,在調用checkParamemterID函數之前,變量x的id為4564813232。需要注意的是,只要x的值沒(méi)有更新,x的id在函數中就不會(huì )改變。但是,一旦該值更新為20,其對應的id將更改為4564813552。需要注意的最重要的一點(diǎn)是,x的id在調用函數后不會(huì )改變,它的原始值保持不變(4564813232)。這意味著(zhù)對x值的更改應用于變量的副本,而不是調用者作用域內的原始變量。
示例代碼如下:
按值傳遞參數定義函數checkParameterID,帶參且按值傳遞defcheckParameterID(x):print(在checkParameterID函數內x值改變之前其值為, x,n其id 為, id(x))在函數范圍內改變參數x的值x =20print(checkParameterID中x的值改變后為, x,n 其id為, id(x))在主程序聲明變量x并賦予初始值x =10print(調用checkParameterID函數之前x的值是, x,n 其id為, id(x))調用checkParameterID函數checkParameterID(x)函數調用后在主程序中顯示關(guān)于x的信息print(調用checkParameterID函數后x的值為, x,n 其id為, id(x))
運行輸出結果類(lèi)似如下:
調用checkParameterID函數之前x的值是 10
其id為 2570870194704
在checkParameterID函數內x值改變之前其值為 10
其id 為 2570870194704
checkParameterID中x的值改變后為 20
其id為 2570870195024
調用checkParameterID函數后x的值為 10
其id為 2570870194704
按引用調用/傳遞
在這種情況下,函數獲取實(shí)參(即原始變量)的引用,而不是它的副本。如果函數內發(fā)生更改,則調用者作用域中原始變量的值也將被修改。在Python中,如果可變參數(如列表)傳遞給函數,則調用/傳遞是通過(guò)引用進(jìn)行的。如下所示,updateList將值5追加到名為y的列表中。即原始可變變量x的值發(fā)生了變化,這證明函數按引用調用/傳遞參數的特征。示例代碼如下:
定義函數upDateList 其改變列表內的值defupdateList(y):y = y.append(5)returny聲明列表x 有四個(gè)元素值x = [1,2,3,4]
print(在調用updateList函數之前,x的內容是:, x)調用函數updateListprint(調用函數updateList)
updateList(x)
print(調用updateList函數后x的內容為:, x)
運行程序輸出結果類(lèi)似如下:
在調用updateList函數之前,x的內容是: [1, 2, 3, 4]
調用函數updateList
調用updateList函數后x的內容為: [1, 2, 3, 4, 5]
本文小結
本期內容介紹了函數的基本內容和實(shí)現語(yǔ)法,以及參數傳遞、有無(wú)參數和返回值的函數形式以及函數調用/傳遞的實(shí)現。
就寫(xiě)這些了,記得點(diǎn)個(gè)贊,關(guān)注一下@傳新視界,分享給更多的朋友吧。
下一期再來(lái)進(jìn)一步介紹關(guān)于函數參數傳遞的幾種實(shí)現方式,敬請關(guān)注,再見(jiàn)!