函數是組織好的、可重複使用的、用來實作單一或相關聯功能的代碼段。
函數能提高應用的子產品性,和代碼的重複使用率。
Python提供了許多内建函數,比如print()。但程式設計人員也可以自己建立函數,這叫做使用者自定義函數。
一、定義一個函數
你可以定義一個由自己想要功能的函數,以下是簡單的規則:
函數代碼塊以 def 關鍵詞開頭,後接函數辨別符名稱和圓括号()。
任何傳入參數和自變量必須放在圓括号中間。圓括号之間可以用于定義參數。
函數的第一行語句可以選擇性地使用文檔字元串—用于存放函數說明。
函數内容以冒号起始,并且縮進。
return [表達式] 結束函數,選擇性地傳回一個值給調用方。不帶表達式的return相當于傳回 None。
例1
def printme( str ):
" Print input string "
print str
return
二、函數調用
定義一個函數隻是給了函數一個名稱,指定了函數裡包含的參數,和代碼塊結構。
這個函數的基本結構完成以後,可以通過另一個函數調用執行,也可以直接從Python提示符執行。
例2
# define function
def printme( str ):
"Print input string"
print str;
return;
# invoke function
printme("invoke self defined function!");
printme("invoke the same function again");
運作結果:
invoke self defined function!
invoke the same function again!
三、參數傳遞
在 python 中,類型屬于對象,變量是沒有類型的:
a = [1,2,3]
a = "Newbie"
以上代碼中,[1,2,3] 是 List 類型,”Newbie” 是 String 類型,而變量 a 是沒有類型,它僅僅是一個對象的引用(一個指針),可以是 List 類型對象,也可以指向 String 類型對象。
(一)可更改(mutable)與不可更改(immutable)對象
在 python 中,strings, tuples, 和 numbers 是不可更改的對象,而 list,dict 等則是可以修改的對象。
不可變類型:變量指派 a=5 後再指派 a=10,這裡實際是新生成一個 int 值對象 10,再讓 a 指向它,而 5 被丢棄,不是改變a的值,相當于新生成了a。
可變類型:變量指派 la=[1,2,3,4] 後再指派 la[2]=5 則是将 list la 的第三個元素值更改,本身la沒有動,隻是其内部的一部分值被修改了。
(二)python 函數的參數傳遞
不可變類型:類似 c++ 的值傳遞,如 整數、字元串、元組。如fun(a),傳遞的隻是a的值,沒有影響a對象本身。比如在 fun(a)内部修改 a 的值,隻是修改另一個複制的對象,不會影響 a 本身。
可變類型:類似 c++ 的引用傳遞,如 清單,字典。如 fun(la),則是将 la 真正的傳過去,修改後fun外部的la也會受影響
(三)python 傳不可變對象的例子
例3
def ChangeInt( a ):
a = 10
b = 2
ChangeInt(b)
print
運作結果:
2
(四)傳可變對象例子
例4
def changeme( mylist ):
"modify input list"
mylist.append([1,2,3]);
print mylist
return
mylist = [10,20,30];
changeme( mylist );
print
因為list是可變對象,是以函數内外的mylist指向了同一個對象,值自然也就相同。故運作結果如下:
[10, 20, 30, [1, 2, 3]]
[10, 20, 30, [1, 2, 3]]
四、參數類型
以下是調用函數時可使用的正式參數類型:
必備參數
關鍵字參數
預設參數
不定長參數
(一)必備參數
必備參數須以正确的順序傳入函數。調用時的數量必須和聲明時的一樣。
調用printme()函數,你必須傳入一個參數,不然會出現文法錯誤:
例5
def printme( str ):
print str;
return;
printme();
運作結果:
Traceback (most recent call last):
File "test.py", line 5 in <module>
printme();
(二)關鍵字參數
關鍵字參數和函數調用關系緊密,函數調用使用關鍵字參數來确定傳入的參數值。
使用關鍵字參數允許函數調用時參數的順序與聲明時不一緻,因為 Python 解釋器能夠用參數名比對參數值。
以下執行個體在函數 printme() 調用時使用參數名做為關鍵字:
例6
def printme( str ):
print str;
return;
printme( str = "Hello World!");
運作結果:
Hello World!
注意,這裡str是關鍵字,是以不能改為别的名稱。以下都是錯的:
s = “Hello World!”
abc = “Hello World!”
下例能将關鍵字參數順序不重要展示得更清楚:
例7
def printinfo( name, age ):
print "Name: ", name;
print "Age: ", age;
return;
printinfo( age=9, name="Theodore"
運作結果:
Name: Theodore
Age: 9
(三)預設參數
調用函數時,預設參數的值如果沒有傳入,則被認為是取預設值。
例8
def printinfo( name, age = 18:
print "Name: ", name
print "Age ", age;
return;
printinfo( age=9, name="Theodore" )
printinfo( name="Li Lei"
運作結果:
Name: Theodore
Age: 9
Name: Li Lei
Age: 18
(四)不定長參數
你在定義函數時可能事先不知道函數被調用時會傳入多少個參數,這時你可以聲明不定長參數。
不定長參數聲明時不會命名,基本文法如下:
def functionname([formal_args,] *var_args_tuple ):
"函數說明"
function_suite
return
加了星号的變量名會存放所有未命名的變量參數。
例9
def printinfo( arg1, *vartuple ):
print arg1
for var in vartuple:
print var
return
printinfo( 10 )
printinfo( 70, 60, 50
運作結果:
10
70
60
50
五、匿名函數
python 使用 lambda 來建立匿名函數。
lambda隻是一個表達式,函數體比def簡單很多。
lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
文法
lambda函數的文法隻包含一個語句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
例10
sum = lambda arg1, arg2: arg1 + arg2;
print sum( 10, 20 )
print sum( 20, 20
運作結果:
30
40
更多内容請關注微信公衆号