fbpx
函式基礎,什麼是函式?什麼是回傳值 return?

Written by 下午 11:15 Python 基礎入門

Python 入門筆記:函式基礎,什麼是函式?什麼是回傳值 return?

這是我的 Python 入門筆記,考量到學習不能只有輸入,也要有輸出,所以一直有做筆記的習慣,做了筆記之後,又覺得何不寫成文章分享給更多初學者呢?於是「Python 入門筆記」系列就誕生了。

本篇含有大量的程式碼以及實作練習,除了必要觀念解釋外,不多廢話。另外在說明部分,因為我也是初學者,因此這篇文章用的是讓程式麻瓜(正是本人)都看得懂的寫法,所以不需要擔心你會看不懂,但是要有耐心是真的,也希望你打開你常用的編輯器一起練習,才能真正學會!

什麼是函式?

直觀來說,函式就是把常用的程式碼包裝在一個區塊中,方便我們在寫程式時隨時呼叫、使用。

如果你難以理解,那你有看過捷運站的蛋糕販賣機嗎?想像函式就是一台蛋糕販賣機,你投幣之後,按照你的選擇(輸入),他會給你不同的蛋糕(結果),函式也是這麼一回事。而為了讓消費者拿到正確的蛋糕,這台蛋糕販賣機的運作規則就需要被設計,同理,我們的函式也需要透過撰寫正確的程式碼來使它正確運作。

函式最重要的用途

函式最重要的用途,就是當你往後在遇到類似運算時,同樣的邏輯可以重複利用,而不需要再多寫好幾行的程式碼,的便利性也讓我們在寫程式的過程中不容易出錯。而當程式碼真的發生錯誤時,你也可以很好的檢查、排除。

如何使用函式?

函式的使用分為兩個階段,分別是:1. 定義。2. 呼叫。一定要先定義函式後,我們後面才能呼叫(使用)函式。

定義函式

def 函式名稱(函式參數):
函式內部的程式碼

粗體區域是固定語法(除了 def 外,別忘記冒號),函式名稱與函式參數則可以自己「用英文」定義。在寫的時候,函式內的程式碼記得要縮排才會被視為是同一個函式哦,下面直接看範例更清楚!

範例

範例一:定義一個印出 hi 的函式

def hiAlvis():
    print("hi") #print 是印出結果的語法

在這個例子中,hialvis 就是函式名稱,沒有實質意義,基本上只要取的讓自己看得懂就好,函式參數的部分我們給空值,不定義任何參數,接著第二行的程式碼我們寫出這個函式的運算規則「印出 hi 」,也就是 print(“hi”) 這個語法。整串程式碼算是很好理解。

範例二:設定參數,定義可以印出任何訊息的函式

def say(something):
    print(something)

這裡的跟範例一不同的地方在,我們給了函式參數一個值叫「something」,他本身沒有任何意義,在這個範例中,最終我們會印出什麼結果,端看我們呼叫函式時給參數的值,在下方會再提到。

範例二要注意的另一個重點是,上方函式參數與下方程式碼內的參數要一致,這樣呼叫函式時才會正確運作哦!

範例三:定義一個可以做加法的函式,也是同樣利用參數。

def add(n1, n2):
    result=n1+n2
    print(result)

範例三我們一行一行看。第一行我們定義函式名稱為 add,並給他函式參數 n1 與 n2,這裡的參數代表什麼還不知道,要看呼叫時怎麼定義。兩個參數用逗號隔開,有沒有空白符號都可以。再來第二行程式碼內我們訂一個變數 result,result 是什麼?result 就是 n1+n2,最後第三行,我們要印出變數 result。

呼叫函式

文章一開始有提到函式的運用分為定義與呼叫兩個階段,上一段我們已經學會如何定義函式,接著就是呼叫函式,呼叫方式:

函式名稱(資料參數)

他跟定義函式時長得有點類似,但要注意括號內的參數名稱跟定義函式內的參數定義是不一樣的,在定義函式時,括號內的參數稱為「函式參數」,而在呼叫函式時,括號內的參數稱為「資料參數」,他們的差別在於,函式參數本身沒有意義,而資料參數我們會給一個「值」,什麼意思呢?往下看範例:

範例一

閱讀前提醒:程式碼內的「#」是註解而非程式碼的一部分哦! 繼續看下去吧。

# 範例一:定義一個印出 hi 的函式

def hiAlvis():
    print("hi")
    
# 呼叫上方定義的函式

hialvis()

當你在編輯器按下執行後,先檢查程式碼是否正確,接著我們檢查呼叫函式的「流程」:在下方呼叫函式後,函式會跳到上方的「 def 函式名稱(函式參數): 」執行該函式内的程式碼「 print(“hi”) 」,也就是印出 hi 之後,再跳回我們所呼叫的函式中。

因此往後你只要輸入「 hialvis() 」,就會得到一個結果「 hi 」。

範例二

# 定義一個可以印出任何訊息的函式

def say(something):
    print(something)
    
# 呼叫上方定義的函式

say("Hi alvis")
say("Hi Python")

在定義函數時,若我們有設定參數,而非空值,則在呼叫函式時,我們可以自由幫參數定義資料。

一樣看流程:在下方呼叫函式後,函式會跳到上方的「 def 函式名稱(函式參數): 」執行該函式内的程式碼,而幫我們有定義「資料參數」時,他也會跳回我們定義的「函式參數」中。

在這個例子裡,我們執行 say(“Hi alvis”),於是 Hi alvis 會跟著跳回我們定義的函式裡,取代「something」,然後印出 Hi alvis。

因為在這裡「something」不是一個真正的資料,只是一個參數,被我們用來定義任何資料,也是因為有參數的設計,讓函式的呼叫變得更有彈性,一樣是「 say(something) 」這個函式,因為有參數使得我可以印出「Hi alvis」或「Hi Python」的結果。

範例三

# 定義一個可以做加法的函式

def add(n1, n2):
    result=n1+n2
    print(result)
 
# 呼叫上方定義的函式

add(1, 8)
add(8, 15)

定義這個函式時,我們給了兩個參數,參數之間用逗號隔開,在呼叫時也一樣用逗號隔開,若沒有特別設定,呼叫函數時我們定義的資料會按照順序對應到參數上。

在下方第一個呼叫的函式中,我們定義了 n1=1 與 n2=8,函式跳上去定義區塊後,會進行程式 1+8,然後印出結果「9」。第二個函式也是一樣,我們定義參數 n1=8、n2=15,根據函式的程式碼,會印出結果「23」。

函式的重點用法:回傳值

什麼是回傳值?

寫法:

def 函式名稱(參數名稱):
    函式內部的程式碼
    return 

# 在這裡,return 的用法是:結束函式,因為沒有定義資料,所以回傳 None,這裡的 None 我們稱為回傳值。

def 函式名稱(參數名稱):
    函式內部的程式碼
    return 資料
    
# 在這裡,return 的用法是:結束函式,回傳「資料」,這裡的資料我們稱為回傳值。

範例一

# 函式回傳 None

def say(sth):
    print(sth)
    return
    
# 呼叫函式,取得回傳值

value=say("hi alvis")
print(value) # 這裡我們會印出「None」

這邊解析一下程式碼的運作流程:當我們呼叫函式「say(“hi alvis”)」,他會跳到上方的定義函式,上方的函式會定義參數 sth=”hi alvis” 然後順著程式走,印出「hi alvis」,這時遇到 return,會跳回到呼叫函式的區塊,然後回傳值的結果是 None(因為 return 我們沒有給資料,就是 None),所以「say(“hi alvis”)」函式結果就是 None,也就是回傳值的結果。

接著 None 會放進我們定義的變數「value」裡,接著程式碼就會印出 value 的結果「None」。

最終這個函式跑完的結果會是:

hi alvis
None

範例二

# 函式回傳字串 Hi

def add(n1, n2):
    result=n1+n2
    return "Hi"
    
# 呼叫函式,取得回傳值

value=add(1, 8)
print(value) # 這裡我們會印出 Hi

一樣先看下方呼叫函式的區塊,value=add(1, 8) 跳到上方訂的函數中,其中 n1=1、n2=8 順著上方區塊的程式碼走,把這個結果放進變數 result 中得到 9,運算完之後遇到 return,這裡的 return 告訴我們要回傳字串 “Hi”,所以 add(1, 8) 的結果就成了「”Hi”」放進變數 value 裡面,印出「Hi」。

其中要注意的就是我們呼叫函數時,或定義函數中有 return,則函數回傳的結果就是看 return 的回傳值,跟原本的程式碼無關,所以不要混在一起,程式碼跑的結果歸程式碼跑的結果,回傳值歸回傳值,兩者是分開的。下面一樣看一下最後印出來的結果。

9
Hi

範例三

範例二相對沒有意義,於是我們把回傳值換成較有意義的變數「 result 」。

# 函式回傳 n1+n2 的結果

def add(n1, n2):
    result=n1+n2
    return result
    
# 呼叫函式,取得回傳值

value=add(1, 8)
print(value) # 這裡我們會印出 9

按照範例二的邏輯去走,最後 result 會得到 9,在這裡我們就可以把 result 從函式內部帶出來(帶出 9)得到以下結果:

9
9

這相對範例二,是一個更有意義的函式,但我上課的時候一直在想,這個函式的結果明明跟下方一樣,為什麼要繞一圈寫?

def add(n1, n2):
    result=n1+n2
    print(result)
    
add(1, 8)

後來才意識到這個寫法不會有 return 回傳值,自然就無法做更多彈性運算了。在文章最尾端的練習我們會看到什麼叫做「有彈性的運算」。

函式用法回顧

寫一個 3×4 的函式

# 定義函式
# 若單純只定義函式,而沒有呼叫,雖然程式碼正確,但就不會執行
def multiply():
    print(3*4)
# 呼叫函式
multiply()

這裡我們得到了 12 這個結果,但是沒有參數的函式是很無聊的,因為你只會得到相同的結果,所以下方我們放入參數讓整個運算更有彈性。

def multiply(n1, n2):
    print(n1*n2)

multiply(1, 8)
multiply(8, 15)

結果是:

8
120

接著我們不在函式內設定變數,直接寫出運算式。

def multiply(n1, n2):
    print(n1*n2) # 程式碼跑完之後,函式的結果要看回傳值,這裡沒有定義所以會自動回傳 None
  
value=multiply(1, 8)
print(value)

結果是:

8
None

或是我們直接將回傳值加上資料:

def multiply(n1, n2):
    print(n1*n2) 
    return 10 

value=multiply(1, 8)
print(value)

結果就會是:

8
10

至於要在定義函式中直接印出結果,還是回傳之後在呼叫函式中印出結果,都可以,取決於程式愈寫愈複雜之後要怎樣比較方便,現在只要記得有這個用法就好。

回傳值的好處

可以在外部繼續操作,如下列程式碼:

def multiply(n1, n2):
    return n1*n2

value=multiply(1, 8)+multiply(8, 15) #這裡意義等同(1*8)+(8*15)
print(value)

基礎函式練習

習題一:如何從 1 加總到 10?(1+2+…+10)

sum=0
for n in range(1, 11):
    sum+=n
print(sum)

習題二:自己動腦想,要如何透過 def 包裝程式碼,使得我們要做類似運算(例如 1 加到 100)時只要呼叫函式即可。

def numbers(n1, n2):
    sum=0
    for n in range(n1, n2):
        sum+=n
    return sum

value=numbers(1, 11)+numbers(1, 21)
print(value)

上面的程式碼是在老師還沒解答的時候我自己想的,還順便在呼叫的時候完了一下加法,結果殊不知老師果然是老師,寫出了更俐落的程式碼,讓整個邏輯變簡單:

def numbers(max):
    sum=0
    for n in range(1, max+1): # 這裡直接只定義參數 max
        sum+=n
    return sum

numbers(10) #從 1 加到 10 的結果

在這基礎之上,我決定寫出一個可以互動的程式碼:試試看:如果想讓用戶自己計算時該怎麼做?

def numbers(max):
    sum=0
    for n in range(1, max+1):
        sum+=n
    return sum

value=numbers(int(input("請輸入你希望運算從 1 加總到幾的數字: "))) 
#因為這時候輸入的數字是字串,記得加入 int 把字串變成浮點數
print(value)

這時候就出現了以下結果:

100 的欄位是使用者可以自己輸入的,按下 Enter 之後會跑出 1 加到 100 的結果:5050。

基礎函式教學就到這邊,如果你希望定期收到 Python 教學或是最新行銷知識,都歡迎訂閱下方我的電子報,若有任何問題也都歡迎留言指教。

不定期分享行銷知識

只有訂閱用戶看得到哦!

訂閱

參考資料:

Close