函數的基本結構
Python中的函數基本結構:
def 函數名([參數清單]):
語句
幾點說明:
- 函數名的命名規則要符合python中的命名要求。一般用小寫字母和單下劃線、數字等組合
- def是函數的開始,這個簡寫來自英文單詞define,顯然,就是要定義一個什麼東西
- 函數名後面是圓括号,括号裡面,可以有參數清單,也可以沒有參數
- 千萬不要忘記了括号後面的冒号
- 語句,相對于def縮進,按照python習慣,縮進四個空格
看簡單例子,深入了解上面的要點:
>>> def name(): #定義一個無參數的函數,隻是通過這個函數列印
... print "hiekay" #縮進4個空格
...
>>> name() #調用函數,列印結果
hiekay
>>> def add(x,y): #定義一個非常簡單的函數
... return x+y #縮進4個空格
...
>>> add(2,3) #通過函數,計算2+3
5
注意上面的add(x,y)函數,在這個函數中,沒有特别規定參數x,y的類型。其實,這句話本身就是錯的,還記得在前面已經多次提到,在python中,變量無類型,隻有對象才有類型,這句話應該說成:x,y并沒有嚴格規定其所引用的對象類型。
這裡的所謂參數,跟前面說的變量,本質上是一回事。python中不需要提前聲明變量,有的語言就需要聲明。隻有當用到該變量的時候,才建立變量與對象的對應關系,否則,關系不建立。而對象才有不同的類型。那麼,在add(x,y)函數中,x,y在引用對象之前,是完全自由的,也就是它們可以引用任何對象,隻要後面的運算許可,如果後面的運算不許可,則會報錯。
>>> add("qiw","sir") #這裡,x="qiw",y="sir",讓函數計算x+y,也就是"qiw"+"sir"
'hiekay'
>>> add("hiekay",4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in add
TypeError: cannot concatenate 'str' and 'int' objects #仔細閱讀報錯資訊,就明白錯誤之處了
從實驗結果中發現:x+y的意義完全取決于對象的類型。在python中,将這種依賴關系,稱之為多态。這是python和其它的靜态語言的重要差別。在python中,代碼不關心特定的資料類型。
對于python中的多态問題,以後還會遇到,這裡僅僅以此例子顯示一番。注意:python中為對象編寫接口,而不是為資料類型。
此外,也可以将函數通過指派語句,與某個變量建立引用關系:
>>> result = add(3,4)
>>> result
7
在這裡,其實解釋了函數的一個秘密。add(x,y)在被運作之前,計算機内是不存在的,直到代碼運作到這裡的時候,在計算機中,就建立起來了一個對象,這就如同前面所學習過的字元串、清單等類型的對象一樣,運作add(x,y)之後,也建立了一個add(x,y)的對象,這個對象與變量result可以建立引用關系,并且add(x,y)将運算結果傳回。于是,通過result就可以檢視運算結果。
調用函數
為什麼要寫函數? 之是以使用函數,主要是:
- 降低程式設計的難度,通常将一個複雜的大問題分解成一系列更簡單的小問題,然後将小問題繼續劃分成更小的問題,當問題細化為足夠簡單時,就可以分而治之。為了實作這種分而治之的設想,就要通過編寫函數,将各個小問題逐個擊破,再集合起來,解決大的問題。(請注意,分而治之的思想是程式設計的一個重要思想,所謂“分治”方法也。)
- 代碼重(chong,二聲音)用。在程式設計的過程中,比較忌諱同樣一段代碼不斷的重複,是以,可以定義一個函數,在程式的多個位置使用,也可以用于多個程式。當然,後面我們還會講到“子產品”(此前也涉及到了,就是import導入的那個東西),還可以把函數放到一個子產品中供其他程式員使用。也可以使用其他程式員定義的函數(比如import ...,前面已經用到了,就是應用了别人——創造python的人——寫好的函數)。這就避免了重複勞動,提供了工作效率。
這樣看來,函數還是很必要的了。廢話少說,那就看函數怎麼調用吧。以add(x,y)為例,前面已經示範了基本調用方式,此外,還可以這樣:
>>> def add(x,y): #為了能夠更明了顯示參數指派特點,重寫此函數
... print "x=",x #分别列印參數指派結果
... print "y=",y
... return x+y
...
>>> add(10,3) #x=10,y=3
x= 10
y= 3
13
>>> add(x=10,y=3) #同上
x= 10
y= 3
13
>>> add(y=10,x=3) #x=3,y=10
x= 3
y= 10
13
>>> add(3,10) #x=3,y=10
x= 3
y= 10
13
在定義函數的時候,參數可以想前面那樣,等待被指派,也可以定義的時候就賦給一個預設值。例如:
>>> def times(x,y=2): #y的預設值為2
... print "x=",x
... print "y=",y
... return x*y
...
>>> times(3) #x=3,y=2
x= 3
y= 2
6
>>> times(x=3) #同上
x= 3
y= 2
6
>>> times(3,4) #x=3,y=4,y的值不再是2
x= 3
y= 4
12
>>> times("hiekay") #再次展現了多态特點
x= hiekay
y= 2
'hiekayhiekay'
注意事項
下面的若幹條,是常見編寫代碼的注意事項:
- 别忘了冒号。一定要記住符合語句首行末尾輸入“:”(if,while,for等的第一行)
- 從第一行開始。要确定頂層(無嵌套)程式代碼從第一行開始。
- 空白行在互動模式提示符下很重要。子產品檔案中符合語句内的空白行常被忽視。但是,當你在互動模式提示符下輸入代碼時,空白行則是會結束語句。
- 縮進要一緻。避免在塊縮進中混合制表符和空格。
- 使用簡潔的for循環,而不是while or range.相比,for循環更易寫,運作起來也更快
- 要注意指派語句中的可變對象。
- 不要期待在原處修改的函數會傳回結果,比如list.append()
- 一定要之用括号調用函數
- 不要在導入和重載中使用擴充名或路徑。