Python 基礎起步 (十) 什麼叫函式?

alpha94511發表於2019-02-16

Python 函式

大家好,這一期讓我們來看看Python中比較核心的知識點:函式(也叫方法),那麼到底什麼是一個函式呢?先讓我引入一個官方一點的定義:

函式是對程式邏輯進行結構化或者過程化的一種程式設計方法。是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。函式能提高應用的模組性,和程式碼的重複利用率。

好啦,我知道這說的不是人話,其實簡單理解就是: 如果我們有一些程式碼可以執行一些功能,比如有100行,我們可以把這些程式碼打包叫做A,那麼A就是一個函式,下次我們想要執行一樣的功能,不用重新寫100行,直接呼叫A就可以了。在接下來的介紹中讓我們看看實際例子

內建函式,呼叫函式

首先,Python內建了很多有用的函式,我們可以直接呼叫。不需要建立。而要呼叫一個函式,需要知道函式的名稱和引數,比如求絕對值的函式abs

abs(-500)
Out:500

很簡單吧,只要直接呼叫函式名和函式需要的引數即可,再看一些其他的內建函式的例子:

type(`Hello`)                # <class `str`>
max(10,20,30,45)             # 45
len(`Hello world`)           # 11

大家看到常用的type函式了吧~,還有很多都是非常好用的內建函式,大家可以自己谷歌百度一下,在實際程式設計中非常有效,不過要注意一點,如果引數傳遞錯誤,那就會出錯:

abs(1, 5)
TypeError: abs() takes exactly one argument (2 given)

這裡很好理解,abs這個內建方法只接受1個引數,這裡傳遞了兩個所以就報錯了。

如何定義一個函式

我們可以自己建立函式,建立一個函式很簡單,利用關鍵字def就可以, 之後依次寫出函式名、括號、括號中的引數和冒號,最後在縮排塊中編寫函式體,函式的返回值用return語句返回。當然,如果不需要返回結果值,也可以不加return。我們以自定義一個求絕對值的my_abs函式為例:

def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x
        

這裡大家就可以發現,我們之前所學到的邏輯條件排上了用場,這裡我們根據絕對值的求法寫出了自己的函式,如果是正數返回函式本身,如果是負數,返回它的相反數。讓我們測試一下

my_abs(-200)   
Out:200

這裡需要注意幾點:函式體內部的語句在執行時,一旦執行到return時,函式就執行完畢,並將結果返回。因此,函式內部通過條件判斷和迴圈可以實現非常複雜的邏輯。

  • 如果沒有return語句,函式執行完畢後也會返回結果,只是結果為None
  • return None可以簡寫為return`。

函式的引數

定義函式的時候,我們把引數的名字和位置確定下來,函式的介面定義就完成了。對於函式的呼叫者來說,只需要知道如何傳遞正確的引數,以及函式將返回什麼樣的值就夠了,函式內部的複雜邏輯被封裝起來,呼叫者無需瞭解。

Python的函式定義非常簡單,但靈活度卻非常大。除了正常定義的必選引數外,還可以使用預設引數、可變引數和關鍵字引數,使得函式定義出來的介面,不但能處理複雜的引數,還可以簡化呼叫者的程式碼。

預設引數

我們仍以具體的例子來說明如何定義函式的預設引數。我們現在想寫一個求平方的函式:

def power(x):
    return x * x

測試一下是否正確

power(5)
Out:25

現在,如果我們要計算 x3x3 怎麼辦?可以再定義一個power3函式,但是如果要計算 x4x4 、 x5x5 ……怎麼辦?我們不可能定義無限多個函式。你也許想到了,可以把 power(x) 修改為 power(x, n),用來計算 xn:

def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

對於這個修改後的 power 函式,可以計算任意 n 次方:

power(2, 3)
Out:8

但是,舊的呼叫程式碼失敗了,原因是我們增加了一個引數,導致舊的程式碼無法正常呼叫:

power(9)
TypeError: power() missing 1 required positional argument: `n`

這個時候,預設引數就排上用場了。由於我們經常計算 x2x2 ,所以,完全可以把第二個引數 n 的預設值設定為 2:

def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

這樣,當我們呼叫 power(5) 時,相當於呼叫 power(5, 2):

power(5)
Out:25

而對於 n > 2 的其他情況,就必須明確地傳入 n,比如 power(5, 3)。從上面的例子可以看出,預設引數可以簡化函式的呼叫。設定預設引數時,有幾點要注意:

  • 必選引數在前,預設引數在後,否則Python的直譯器會報錯(思考一下為什麼預設引數不能放在必選引數前面)
  • 如何設定預設引數

好啦,今天先為大家講到這裡,有很多複雜的方法還要大家自己去探索,

相關文章