函式的基本結構
python中的函式基本結構:
複製** **如下:
def 函式名([引數列表]):
語句幾點說明:
•函式名的命名規則要符合python中的命名要求。一般用小寫字母和單下劃線、數字等組合
•def是函式的開始,這個簡寫來自英文單詞define,顯然,就是要定義乙個什麼東西
•函式名後面是圓括號,括號裡面,可以有引數列表,也可以沒有引數
•千萬不要忘記了括號後面的冒號
•語句,相對於def縮排,按照python習慣,縮排四個空格
看簡單例子,深入理解上面的要點:
複製** **如下:
>>> def name(): #定義乙個無引數的函式,只是通過這個函式列印
... print "qiwsir" #縮排4個空格
...
>>> name() #呼叫函式,列印結果
qiwsir
>>> 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"
'qiwsir'
>>> add("qiwsir",4)
traceback (most recent call last):
file "", line 1, in
file "", 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就可以檢視運算結果。
如果看官上面一段,感覺有點吃力或者暈乎,也不要緊,那就再讀一邊。是在搞不明白,就不要搞了。隨著學習的深入,它會被明白的。
呼叫函式
扯了不少函式怎麼編寫,到底編寫函式有什麼用?在程式中怎麼呼叫呢?
為什麼要寫函式?從理論上說,不用函式,也能夠程式設計,我們在前面已經寫了乙個猜數字的程式,在那麼就沒有寫函式,當然,用python的函式不算了。現在之所以使用函式,主要是:
1.降低程式設計的難度,通常將乙個複雜的大問題分解成一系列更簡單的小問題,然後將小問題繼續劃分成更小的問題,當問題細化為足夠簡單時,就可以分而治之。為了實現這種分而治之的設想,就要通過編寫函式,將各個小問題逐個擊破,再集合起來,解決大的問題。(看官請注意,分而治之的思想是程式設計的乙個重要思想,所謂「分治」方法也。)
2.**重(chong,二聲音)用。在程式設計的過程中,比較忌諱同樣一段**不斷的重複,所以,可以定義乙個函式,在程式的多個位置使用,也可以用於多個程式。當然,後面我們還會講到「模組」(此前也涉及到了,就是import匯入的那個東西還可以把函式放到乙個模組中供其他程式設計師使用。也可以使用其他程式設計師定義的函式(比如import ...,前面已經用到了,就是應用了別人——創造python的人——寫好的函式)。這就避免了www.cppcns.com重複勞動,提供了工作效率。
這樣看來,函式還是很必要的了。廢話少說,那就看函式怎麼呼叫吧。以add(x,y)為例,前面已經演示了基本呼叫方式,此外,還可以這樣:
複製** **如下:
>>> def add(x,y): #為了能夠更明了顯示引數賦值特點,重寫此函式
... print "x=",x #分別列印引數賦值結果
... print "y=",y
... return x+y
...
>>> add(10,3) &n #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
... retur 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("qiwsir") #再次體現了多型特點
x= qiwsir
y= 2
'qiwsirqiwsir'
給列位看官提乙個思考題,請在閒暇之餘用python完成:寫兩個數的加、減、乘、除的函式,然後用這些函式,完成簡單的計算。
注意事項
下面的若干條,是常見編寫**的注意事項:
1.別忘了冒號。一定要記住符合語句首行末尾輸入「:」(if,while,for等的第一行)
2.從第一行開始。要確定頂層(無巢狀)程式**從第一行開始。
3.空白行在互動模式提示符下很重要。模組檔案中符合語句內的空白行常被忽視。但是,當你在互動模式提示符下輸入**時,空白行則是會結束語句。
4.縮排要一致。避免在塊縮排中混合製表符和空格。
5.使用簡潔的for迴圈,而不是while or range.相比,for迴圈更易寫,執行起來也更快
6.要注意賦值語句中的可變物件。
7.不要期待在原處修改的函式會返回結果,比如list.append()
8.一定要之用括號呼叫函式
9.不要在匯入和過載中使用副檔名或路徑。
本文標題: 跟老齊學python之重回函式
本文位址:
跟老齊學Python之Python安裝
任何高階語言都是需要乙個自己的程式設計環境的,這就好比寫字一樣,需要有紙和筆,在計算機上寫東西,也需要有文字處理軟體,比如各種名稱的office。筆和紙以及office軟體,就是寫東西的硬體或軟體,總之,那些文字只能寫在那個上邊,才能最後成為一篇文章。那麼程式設計也是,要有個什麼程式之類的東西,要把...
跟老齊學Python之集合的關係
凍結的集合 前面一節講述了集合的基本概念,注意,那裡所涉及到的集合都是可原處修改的集合。還有一種集合,不能在原處修改。這種集合的建立方法是 f set frozenset qiwsir 看這個名字就知道了frozen,凍結的set f set frozenset q i s r w f set.ad...
跟老齊學Python之複習if語句
基本語句結構 複製 如下 if 判斷條件1 執行語句1 elif 判斷條件2 執行語句2 elif 判斷條件3 執行語句3 else 執行語句4 只有當 判斷條件 的值是true的時候,才執行下面的執行語句。那麼,在python中,怎麼知道乙個判斷條件是不是真呢?這個問題我們在眼花繚亂的運算子中已經...