標籤:函數 python 電議
函數,是一小部分功能的集合。對於純物件導向語言的JAVA而已,並沒有獨立於類之外的函數。這裡不參與對比。和C++一樣,Python支援單獨定義函數,且函數的範圍為也可以理解為是Global的。只要把這個module import進來了,裡面的函數就能直接使用
C++中函數的定義格式非常簡單:傳回值 函數名(參數...){函數體},就構成了一個函數。
而在Python中,因為是動態語言,所以不需要傳回值類型定義;同樣參數也只有名稱,沒有類型;此外,python給函數增加了一個關鍵def來標識,這點和C++中也不太一樣。
範例:
>>> def sum(a,b):
return a+b
>>> print sum(1,4)
5
Python中的函數參數支援預設值,這點和C++中一樣,但是JAVA中的函數是不支援預設值的。但是,python中函數參數值有個最大的不同在於,它的預設參數僅僅在第一次使用的時候進行判斷,之後再調用該函數時,就直接採用第一次使用的那個對象,而不是再進行一次賦值操作。由於python的這個特性,使的在使用可變對象(例如list、dictionary以及class)作為預設參數時,需要尤其注意;因為很有可能這個對象在使用的過程中取值發生了變化,導致同樣是採用預設參數調用該函數,前後兩次調用的結果卻不一樣。
例如:定義函數f,第二個參數的預設參數是一個空的list,在執行完該函數後,這個list中的取值,不再是空的,而是有了一個a對象;當我們第二次調用f,仍然僅傳入一個參數,第二個參數採用預設值時,此時的預設值不再是空了,而是包含了一個a對象的list,導致第二次調用f,返回的結果是[a,a]。如果不想要這樣的結果,就需要把預設參數L的取值,修改為None,讓其不能被改變。
>>> def f(a,L=[]):
L.append(a)
return L
>>> print f(1)
[1]
>>> print f(2)
[1, 2]
這點其實和C++中採用全域變數作為參數的預設值一樣,函數的調用是會根據全域變數的取值變化而變化的;我們可以理解為Python自己用一個變數在第一次調用該函數時儲存了其預設變數的取值,如果有操作修改了該變數,那麼下一次調用該函數時,python仍然使用該變數去操作,自然結果就不同了。
除了預設值外,python函數還支援通過參數名稱來指定參數,例如下面這個函數,一共有a,b,c三個參數,其中b和都設定了預設值,在調用函數的時候,可以不按照函數定義時參數的順序,而是通過參數的名稱,指定參數的取值。在C++中,我們調用函數時是不能寫錯參數的順序的。
>>> def max(a,b=3,c="hell0"):
print a
print b
print c
>>> max(c="ttt",a="44")
44
3
ttt
Python的函數傳參還有一個非常奇葩我覺得不可理解的功能,居然支援傳入dictionary;看下面這個函數定義的例子,*c表示支援傳入不定個數個參數,**d表示的是傳入不定個數個key-value對。函數傳入不定參,在C++也支援,通過...來標識,取參數的值時,是通過第一個參數的地址位移來擷取對象的取值的。Python的實現和JAVA比較類似,都是通過數組來實現不定長參數的,雖然JAVA中也是通過...來標識,但是本質上和C++有很大的區別。
>>> def f(a,*c,**d):
print a
for i in c:
print i
keys = sorted(d.keys())
for k in keys:
print k, ":", d[k]
>>> f(1,"fsfer",hit="rwerwe",get="werwe")
1
fsfer
get : werwe
hit : rwerwe
從整體上來說,python的函數比C++和JAVA函數的功能都更強大一些,雖然這些更為強大的功能未必有很大的用途。
本文出自 “星光” 部落格,請務必保留此出處http://galaxyflower.blog.51cto.com/9006676/1530075