這是我的 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 的回傳值,跟原本的程式碼無關,所以不要混在一起,程式碼跑的結果歸程式碼跑的結果,回傳值歸回傳值,兩者是分開的。下面一樣看一下最後印出來的結果。
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
這相對範例二,是一個更有意義的函式,但我上課的時候一直在想,這個函式的結果明明跟下方一樣,為什麼要繞一圈寫?
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)
這時候就出現了以下結果:

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