函數(shù)是組織好的,可重復(fù)使用的谴垫,用來(lái)實(shí)現(xiàn)單一旁舰,或相關(guān)聯(lián)功能的代碼段。
函數(shù)能提高應(yīng)用的模塊性钠绍,和代碼的重復(fù)利用率。你已經(jīng)知道Python提供了許多內(nèi)建函數(shù)花沉,比如print()柳爽。但你也可以自己創(chuàng)建函數(shù),這被叫做用戶自定義函數(shù)碱屁。
定義一個(gè)函數(shù)
你可以定義一個(gè)由自己想要功能的函數(shù)磷脯,以下是簡(jiǎn)單的規(guī)則:
- 函數(shù)代碼塊以 def 關(guān)鍵詞開(kāi)頭,后接函數(shù)標(biāo)識(shí)符名稱和圓括號(hào)()娩脾。
- 任何傳入?yún)?shù)和自變量必須放在圓括號(hào)中間赵誓。圓括號(hào)之間可以用于定義參數(shù)。
- 函數(shù)的第一行語(yǔ)句可以選擇性地使用文檔字符串—用于存放函數(shù)說(shuō)明。
- 函數(shù)內(nèi)容以冒號(hào)起始俩功,并且縮進(jìn)幻枉。
- return [表達(dá)式] 結(jié)束函數(shù),選擇性地返回一個(gè)值給調(diào)用方诡蜓。不帶表達(dá)式的return相當(dāng)于返回 None熬甫。
語(yǔ)法
def functionname( parameters ):
"函數(shù)_文檔字符串"
function_suite
return [expression]
默認(rèn)情況下,參數(shù)值和參數(shù)名稱是按函數(shù)聲明中定義的順序匹配起來(lái)的蔓罚。
實(shí)例
以下為一個(gè)簡(jiǎn)單的Python函數(shù)椿肩,它將一個(gè)字符串作為傳入?yún)?shù),再打印到標(biāo)準(zhǔn)顯示設(shè)備上豺谈。
def printme( str ):
"打印傳入的字符串到標(biāo)準(zhǔn)顯示設(shè)備上"
print str
return
函數(shù)調(diào)用
定義一個(gè)函數(shù)只給了函數(shù)一個(gè)名稱郑象,指定了函數(shù)里包含的參數(shù),和代碼塊結(jié)構(gòu)茬末。這個(gè)函數(shù)的基本結(jié)構(gòu)完成以后厂榛,你可以通過(guò)另一個(gè)函數(shù)調(diào)用執(zhí)行,也可以直接從Python提示符執(zhí)行丽惭。如下實(shí)例調(diào)用了printme()函數(shù):
# 定義函數(shù)
def printme( str ):
"打印任何傳入的字符串"
print str;
return;
# 調(diào)用函數(shù)
printme("我要調(diào)用用戶自定義函數(shù)!");
printme("再次調(diào)用同一函數(shù)");
輸出結(jié)果如下:
我要調(diào)用用戶自定義函數(shù)噪沙!
再次調(diào)用同一函數(shù)
參數(shù)傳遞
在 python 中,類型屬于對(duì)象,變量是沒(méi)有類型的:
a=[1,2,3]
a="Runoob"
以上代碼中,[1,2,3] 是 List 類型吐根,"Runoob" 是 String 類型正歼,而變量 a 是沒(méi)有類型,她僅僅是一個(gè)對(duì)象的引用(一個(gè)指針)拷橘,可以是 List 類型對(duì)象局义,也可以指向 String 類型對(duì)象。
匿名函數(shù)
python 使用 lambda 來(lái)創(chuàng)建匿名函數(shù)冗疮。
- lambda只是一個(gè)表達(dá)式萄唇,函數(shù)體比def簡(jiǎn)單很多。
- lambda的主體是一個(gè)表達(dá)式术幔,而不是一個(gè)代碼塊另萤。僅僅能在lambda表達(dá)式中封裝有限的邏輯進(jìn)去。
- lambda函數(shù)擁有自己的命名空間诅挑,且不能訪問(wèn)自有參數(shù)列表之外或全局命名空間里的參數(shù)四敞。
- 雖然lambda函數(shù)看起來(lái)只能寫(xiě)一行,卻不等同于C或C++的內(nèi)聯(lián)函數(shù)拔妥,后者的目的是調(diào)用小函數(shù)時(shí)不占用棧內(nèi)存從而增加運(yùn)行效率忿危。
語(yǔ)法
lambda函數(shù)的語(yǔ)法只包含一個(gè)語(yǔ)句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
如下實(shí)例:
# 可寫(xiě)函數(shù)說(shuō)明
sum = lambda arg1, arg2: arg1 + arg2;
# 調(diào)用sum函數(shù)
print "相加后的值為 : ", sum( 10, 20 )
print "相加后的值為 : ", sum( 20, 20 )
輸出結(jié)果如下:
相加后的值為:30
相加后的值為:40
return 語(yǔ)句
return語(yǔ)句[表達(dá)式]退出函數(shù)没龙,選擇性地向調(diào)用方返回一個(gè)表達(dá)式铺厨。不帶參數(shù)值的return語(yǔ)句返回None缎玫。之前的例子都沒(méi)有示范如何返回?cái)?shù)值,下例便告訴你怎么做:
# 可寫(xiě)函數(shù)說(shuō)明
def sum( arg1, arg2 ):
# 返回2個(gè)參數(shù)的和."
total = arg1 + arg2
print "函數(shù)內(nèi) : ", total
return total;
# 調(diào)用sum函數(shù)
total = sum( 10, 20 );
輸出結(jié)果如下:
函數(shù)內(nèi):30
全局變量和局部變量
定義在函數(shù)內(nèi)部的變量擁有一個(gè)局部作用域解滓,定義在函數(shù)外的擁有全局作用域赃磨。局部變量只能在其被聲明的函數(shù)內(nèi)部訪問(wèn),而全局變量可以在整個(gè)程序范圍內(nèi)訪問(wèn)洼裤。調(diào)用函數(shù)時(shí)邻辉,所有在函數(shù)內(nèi)聲明的變量名稱都將被加入到作用域中。如下實(shí)例:
total = 0; # 這是一個(gè)全局變量
# 可寫(xiě)函數(shù)說(shuō)明
def sum( arg1, arg2 ):
#返回2個(gè)參數(shù)的和."
total = arg1 + arg2; # total在這里是局部變量.
print "函數(shù)內(nèi)是局部變量 : ", total
return total;
#調(diào)用sum函數(shù)
sum( 10, 20 );
print "函數(shù)外是全局變量 : ", total
輸出結(jié)果如下:
函數(shù)內(nèi)的局部變量是:30
函數(shù)外的全局變量是:0