fbpx
函式參數教學-參數預設值、名稱對應、不定參數

Written by 上午 12:07 Python 基礎入門

Python 入門筆記:函式參數教學-參數預設值、名稱對應、不定參數

接續上一篇「Python 入門筆記:函式基礎,什麼是函式?什麼是回傳值 return?」,我們已經理解了函式的運作基礎,介紹了包含參數、回傳值的觀念,若你還不了解這些名詞,可以先回去複習。接著這篇會針對函式參數該如何使用做進一步說明,包含「預設資料」、「名稱對應」、「不定參數」三個部分。

在正式開始前,也不忘囉唆,「Python 入門筆記」系列是我的學習筆記,內部含有大量程式碼並搭配必要之註解。身為初階 Python 學習者,我希望可以用淺顯易懂的白話文去說明 Python 的相關概念,所以不需要擔心你會看不懂,只需要保有耐心,一起用心學習,打開你的編輯器,準備開始囉。

為函式預設資料

目前我們會利用函式印出的值,或是任意的值,但當我們想要在「有輸入資料時印出資料的值,在沒輸入的時候印出預設值」,該怎麼做?這時候只要為函式預設資料就可以完成語法也很簡單:

def 函式名稱(參數名稱=預設資料):
函式內部的程式碼

語法跟一般函式差異不大,只是在這裡我們指定一個參數名稱,接著利用「 = 」幫參數設定一個預設值,這樣就完成預設資料的設定,下面直接看程式碼範例:

# 參數 msg 預設資料為 "hello"
def say(msg="hello"):
    print(msg)
    
# 這個函式我們可以有兩種用法
# 1.印出 "hello function"
say("hello function")
# 這時候 msg 這個參數被我們輸入資料 "hello function" 所以會印出 hello function
# 2.印出預設資料 "hello"
say()
# 因為沒有給值

可以從下圖中看到結果:

情境練習:開次方

我們如何寫一個可以開任意次方的函式呢?程式碼如下:

# 定義
def power(base, exp=0): 
    print(base**exp)
# 呼叫    
power(3, 2)

這一段有兩個重要的概念:第一、開次方有慣用的參數名稱,分別是 base、exp。base 代表要開次方的數,exp 代表要開幾次方,例如說我們要開 3 的 2 次方,那麼 base = 3、exp = 2。第二、在 Python 中如果想要開次方,就用兩個 * 代表即可,跟上述一樣我們開 3 的 2 次方,那麼在 Python 中的表示方式就會是 3**2。

在這個函式中,我們得到結果 9:

但上方的函式在沒有給值的時候就會發生錯誤,為了避免這個錯誤,我們要套用預設值的概念,幫 exp 代入 0,原因任何數開 0 次方都會等於 1,這樣能確保如果如果我們只輸一個值,函式也不會出現錯誤,程式碼如下:

def power(base, exp=0):
    print(base**exp)
    
power(5) # 當我們沒有輸入第二個資料,函式會自動帶入預設值,於是得到結果:1

用參數名稱對應資料

在前面的函式中,或我們在呼叫函式時沒有特別指定參數與資料之間的順序,那麼他就會按照順序對應到參數上,例如呼叫 say(1, 2),那麼 (1, 2) 就會依序帶入函式的參數中。可是若我們想指定參數資料也是可以的,看下面語法:

def 函式名稱(名稱1, 名稱2):
    函式內部的程式碼
    
# 呼叫函式時,以參數名稱對應資料
函式名稱(名稱2=8, 名稱1=1)
# 若不指定就會照順序

這超簡單,我們直接用一個算除法的函式範例看結果,這樣你就對如何應用很清楚了:

# 定義一個可以做除法的函式
def divide(n1, n2):
    result=(n1/n2)
    print(result)
# 呼叫函式時給對應名稱
divide(n2=4, n1=2) # 印出 0.5
# 呼叫函式時不指定名稱
divide(4, 2) # 印出 2

實際結果如下:

不定參數數量

當你想要讓使用者放不固定的參數數量時,例如有時候想要 3 個,有時候想要 5 個甚至 100 個,都不固定,這時就可以使用這個語法,做法很簡單,只要在參數前面加上「*」,就帶代表參數可接受長度不限的資料,範例如下:

def 函式名稱(*無限參數): 
    函式內部的程式碼
    
函式名稱(資料1, 資料2, 資料3,)  # 這時當我們呼叫函式,可傳入無限數量的參數

這裡我們需要一行一行看。當我們將參數放入「 * 」符號時,參數內的資料就會以 Tuple 的資料型態整理,Tuple 就是指「列表」,在 Python 裡會用小括號來表現,例如: (1, 8, 8,15) ,下面我們看範例,會更理解是什麼意思。

# 函式接受無限資料 msgs
def say(*msgs):
    # 這裡會用 Tuple 形式整理,所以如果沒整理,就會印出列表形式的結果
    print(msgs) 
    
# 呼叫函式,傳入三個參數資料    
say("hello", "hi", "alvis")    

上方我們設定 msgs 為無限參數,並直接印出參數 msgs。在呼叫 say 函式時,我們給了三個值分別是 (“hello”, “hi”, “alvis”) ,他們會被以 Tuple(列表)的形式呈現,結果如下:

但是他有點醜,所以我們會使用「迴圈」來整理韓式的結果(關於迴圈,之後我會再寫一篇來給大家詳細說明),程式碼如下:

# 寫一個有用迴圈整理之後的結果
# 函式接受無限資料 msgs
def say(*msgs):
    for msg in msgs: # 用迴圈語法處理 
        print(msg)  # 這裡記得要縮排才會被視為迴圈語法內程式
    
say("hello", "hi", "alvis")  

這裡我們一行一行看。首先第一行,我們定義一個函式 say,並放入無限參數 *msgs,這部分照舊。接著第二行由於我們呼叫的值會以 Tuple(列表)的形式呈現,所以我們用迴圈的寫法( for 變數 in 資料),設定變數 msg,然後 msg 就會逐一處理 msgs 裡的每個值再印出來。第三行我們印出 msg 的結果,然後就會拿到如下圖的乾淨結果:

情境練習:算平均數

當我們要算出平均數時,會需要知道兩件事,分別是「總和」、「有幾個值」,兩者相除後就可以獲得平均數,所以我們在程式碼中要先讓不定參數的可以一直加總,然後計算出有幾個值,最後相除就能獲得算平均數的函式,程式碼如下:

def avg(*ns):
    sum=0 # 要算平均數,先算出總和
    for n in ns:
        sum+=n # 在這一個迴圈中把資料一個一個加進去
    print(sum/len(ns)) #然後再把總合除以列表長度  # 因為 ns 是一個列表,所以我們用操作列表的 len 來算出 ns 這個列表有幾個資料
avg(1, 8)  # 算出 1 跟 8 的平均數。

這裡有點難度,我們一樣一行一行看:

第一行 def avg(*ns): 我們定義函式名稱為 avg,且定義無限參數叫 *ns。

第二行 sum=0 是用來做加總使用,他會跟第四行程式碼有關,你可以想像我們要做一個加總,而且從 0 開始,這就是他的意思。

第三行 for n in ns: 是迴圈,迴圈的概念剛剛有簡單介紹過,在這裡 for 變數 in 資料: 是固定用法。我們設定迴圈變數為 n,資料為參數 ns,同時參數 ns 也是一個列表,所以他的運算方式會是 n 從 ns 中拿出第一個數字、再拿出第二個數字、第三個數字,依此類推。

第四行 sum+=n 代表的意思就是 sum=sum+n,Python 比較特別,sum=sum+n 要這樣看:右邊的值傳給左邊,所以他的結果不是 n=0,而是迴圈每跑一次,sum 就變成一個新的值。這裡結合上方的程式碼,就會等於,n 從 ns 拿出數字 1 然後做加總:0+1,第一次迴圈的結果,sum 成了 1。接著 n 再從 ns 中拿出數字 8,接著做加總:1+8,所以 sum 成了 9,如此一來我們就能透過這個函式加總無限的數。

第五行 print(sum/len(ns)) 就是印出「總和/有幾個值」的結果,sum 是我們上方計算完的值, len(ns) 則是固定語法,可以用來計算列表 ns 中有幾個值,利用這個函式,我們就可以算出任意值的平均數,得出如下結果:


以上就是參數預設值、名稱對應、不定參數的教學,希望這篇文章有幫助到你學習。如果想收到更多 Python 相關文章,也歡迎加入我的電子報,若有文章更新就會直接寄送給你哦!

立刻加入電子報接收最新行銷知識!

訂閱

參考資料:彭彭老師-函式參數詳解:參數預設值、名稱對應、任意長度參數

Close