python
已經寫程式也有一段時間了,可能會發現有些程式碼可以重複利用,因此常常會「複製」、「貼上」,常常有些算式只是變數的不同,但算式是一樣的,這時候我們就可以封裝成函式來重複使用,好處有:
例如:
改用函式會變成:
九九乘法表:
函式是一種流程上的抽象,封裝了實作細節,例如上面範例,以後如果要進行更多比較,只要呼叫compre()
函式就可以了,而不需要管函式內是怎麼實作的。
使用關鍵字def
來定義函式,格式如下:
注意:
避免使用的命名:
在呼叫函式的時候,可以從外部傳入資料讓函式處理,例如:
在參數中可以設定預設值,如果沒有傳入該參數,就會自動以預設值來帶入,例如:
會輸出:
有參數預設值的參數不可以在沒有參數預設值的參數前面。
在傳入參數時,可以使用關鍵字引數,就可以不需要照參數的順序傳入,例如:
當函式執行完後,如果會產生結果,可以透過return
關鍵字來將結果值回傳給呼叫者,例如:
會輸出:
函式內如果遇到
return
陳述句,就會馬上結束函式執行並跳離函式。
在Python裡函式也是物件,也就是說可以被放到變數裡傳遞,例如:
會輸出:
Python的函式因為可以像變數ㄧ樣被傳遞,因此稱為一級函式,例如:
會輸出:
swap函式播指派給s變數,因此s變數可以當成函式一樣被呼叫,其功用則和直接呼叫swap()函式一樣。
Python函式也可以被當成參數一樣傳遞:
會輸出:
透過type()函式可以發現show函式為一個function
型態。
使用callable()函式可以用來測試一個變數是否可以被呼叫,例如:
會輸出:
Lambda也是函式,但是沒有函式名稱,也就是匿名函式,它只有一行運算式,可以用簡潔的語法完成原本需要較多行才能完成的程式碼,許多現代程式語言(例如:Java和C#等等)也都支援Lambda函式來處理小型的運算。
例如:
會輸出:
在很多情況下,函式內可能只是很簡單判斷式,也可以用更簡潔的語法lambda
來表示,例如:
使用lambda
可改寫為:
就可以透過像一般函式呼叫的方式來做這樣的呼叫:
甚至可以直接這樣呼叫:
補充
Lambda函式支援IIFE(Immediately invoked function expression)語法,意思就是說定義完後就可以直接被呼叫;如果沒有直接被呼叫,則是回傳一個function物件。
yield函式是一個產生器 (generator),用於迭代中。
使用方式則是類似於 return,不一樣的地方是,函式裡可以有多個yield,每次遇到yield時,函式就會返回,並回傳yield後面的值,然後記下目前的位置,等待下一次呼叫時,會從該yield位置的下一行程式碼開始執行。
其好處就是可以不用一次回傳全部得值,而是一個一個回傳,可以節省記憶體的使用。
next()
和send()
直接呼叫yield函式會拿到一個generator
物件,接著透過next()或send()函式來呼叫該generator
物件。
補充
for
迴圈會以捕捉StopIteration
來做為結束,所以如果yield
函式return None
,就會發生StopIteration
例外;在呼叫next()
函式的時候如果提供預設值的參數,就不會引發StopIteration
例外,例如:
變數可以在三個不同的地方分配
作用域法則
變數名解析
print()
函示為了可以輸出結果到終端機視窗,可以使用print()
函示,如果有多個結果同時輸出,可以使用逗號,
分隔。
如果想要輸出多的字串時,每個字串用逗號「,
」做分隔,可以加上sep=', '
,例如:
print()
函式預設輸出後一定會做換行,如果不想換行,可以指定end=''
,例如:
type()
函式無論是十進位、二進位、八進位、十六進位整數,都是int類別,如果想知道某種資料的型態,可以使用type()
函式來取得,並搭配print()函式
來顯示到終端機視窗上。
例如:
計算指定序列內數字的加總,例如:
輸出為: