第十屆鐵人賽 flask-restful DAY07-搞懂Python的方法

為什麼要用方法

相信讀者撰寫程序時常常會有不斷的撰寫一樣程序的狀況,但是需要維護程序時通常會需要修改許多地方,而且常常會有所遺漏,這時候讀者們都會想說如果修改一個地方就可以更新所有的地方的話不知道該有多好。再來不斷寫同樣的程序就算寫的人不膩,Review的人也會膩,因此要如何重複利用寫過的程序就顯得重要。以上是大家讀者以及筆者本人的想法,其實軟體開發的大神也有相同的想法,所以提出了一個Dry的原則。然而要如何重複利用所寫的程序呢,透過方法的撰寫就是其中一個方式。

方法怎麼撰寫

先請讀者們看看下列的式子,透過下列式子讓讀者們了解要如何撰寫第一個方法:

def printHelloWorld():
    print('Hello World')

如此,就完成了讀者們的第一個方法,功能是印出Hello World的一個方法。從上面的式子可以知道基本的方法是由宣告詞def 開始,後面尾隨的是printHelloWorld方法的名稱,接下來( )小括號內是輸入的參數,最後結尾是:,而方法實做的內容則在縮排內撰寫。

如何覆用

透過上述方式可以撰寫方法,但是這樣子的方法如何用在許多地方呢,例如每個程序有想要列印出來的訊息要如何使用呢?所以這時候就先看看以下例子:

def sayHiToParam(param):
    print('Hi {0}'.format(param))

這時候讀者就可以將不同的地方透過參數放在( ) 內傳遞,然後方法的實作再取參數使用,例如上述的例子就可以讓其他使用方法的地方傳遞param 到方法內,如果今天需要將所有Hi更改為Hello只要修改這方法即可。

預設參數

有時撰寫程序時會希望給使用者便利性,例如有些參數可以希望可以給予使用方法的人彈性,但是不需要這彈性的使用者又希望給他便利性,所以就可以透過預設參數來完成,接下來就看看甚麼是預設參數:

def sayParamYear(param, year = 10):
    print("I'm {0} and I'm {1} years old".format(param, year))

其中我們再定義方法實已經給year這參數預定為10,不過外部使用者亦可以傳入參數來改變year這變數。儘管預設參數可以給予使用者便利性,但是他也帶來另外一個坑,請各位先看看以下例子:

def appendParamToArray(param, array = []):
    array.append(param)
    print(array)

appendParamToArray(1)
appendParamToArray(2)
arr = []
appendParamToArray(1, arr)
appendParamToArray(2, arr)

各位讀者猜猜這段程式的結果會印出什麼,相信踩過坑的讀者會露出會心的一笑,沒錯答案如下:

[1]
[1, 2]
[1]
[1, 2]

為什麼答案會是這樣呢,相信第一次使用Python的讀者會出乎意料地問這問題,因為Python的預設參數有個特性,當執行到def 的函式定義時,就建立了空串列物件並賦予array,而這個物件會一直存在,如果你沒有指定array的串列物件時,所使用的就一直會是一開始指定的預設空串列物件,因此appendParamToArray(2) 所使用的array即是appendParamToArray(1) 所產生的空串列物件,而appendParamToArray(1, arr)appendParamToArray(1, arr) 用的則是arr = [] 這時產生的串列物件,所以當預設參數遇到之前的可變型態時就要特別注意了。以下這方法可以解決上述可變型態預設參數的問題:

def appendParamToArray(param, array = None):
    if not array:
        array = []
    array.append(param)
    print(array)

上述式子就是先不指定空串列給array,直到方法的時做檢查發現沒有給予array 時才給予空串列物件。儘管此方法可以避免可變型態預設參數的問題,但是還是盡量避免使用預設參數的描述再可變型態上。

小結

經過上述的內容相信各位讀者對於Python的方法有更進一步的認識,透過方法可以讓程序覆用之外,OOP更是讓程序覆用更提升到另一個境界,所以下一章就來談談Python的OOP,敬請期待。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *