函式就像程式的積木,透過堆疊積木,就可以把想要的功能完成!Licensed by Adobe Stock
這天 Meiko 開著車到了保養廠,在休息室間,看著窗外的車子一台一台進到保養區。
Meiko 想著這段時間學到的程式,感覺學了不少。
Meiko:「Jason,我們前面學了不少東西了耶!」
Jason :「對啊,在這麼短的時間,其實你已經從一個程式生手,學會了輸入、輸出,條件判斷,for-loop,串列還有字典,基本的技巧你都走過一輪了。」
Meiko:「不過,我覺得我現在學到的東西,好像還是有點片段,有些時候不太知道怎麼把這這些內容全部結合再一起。」
Jason:「因為你現在就像在打基礎,我們前面學的部分,比較像在玩樂高一樣,你學到的都是一塊塊的積木。不過如果你想要處理比較多事情的話,你寫的程式可能就會變得比較冗長。」
Meiko:「好像是耶,不過我現在寫得最長的程式,就是一開始你教我印出星期一到星期日,然後再把每天花的錢印出來。程式應該不是只能做這樣的事情,對吧?」
Jason:「對啊,所以我今天要跟你講一個新的概念,叫做函式function
。它的用意在避免重複的程式碼出現在程式中。」
Meiko:「我不知道什麼是函式拉,不過我倒是蠻喜歡吃韓式拌飯的。」
Jason:「(不理 Meiko 繼續說) 所謂的函式function
就像一個黑盒子,你給它input
,自行指定它的功能。在使用之後,它就會產出output
給你。」
Meiko:「黑盒子?」
Jason:「你看,你今天開車到保養場,把車子交給服務人員進行保養,保養廠好像就是一個函式function
,你的 input 就是你尚未保養的車,等待服務人員在保養廠幫你保養之後,output
就會是一台已經保養好,可以安全上路的車。平常只要你車子開到特定的里程數,來保養廠就好?」
Meiko:「會啊,不來保養,儀表板上會一直有燈在閃,開起來很不安心。原來函式是這個意思,感覺上就是有一個特定功能的地方,我需要它的時候就來給它服務一下。」
Jason :「蠻像的,在寫程式的時候,遇到同一個操作,只需要呼叫這個函式就好,我們就不需要每次遇到同一個操作就再寫一次程式,你不會每次要保養的時候,自己又去蓋一個保養廠,對吧?」
Meiko:「可是寫程式都在電腦裡面,不就複製、貼上就好了?幹嘛那麼麻煩還要學一個新的概念?」
Jason:「那是因為你現在寫的程式不超過 50 行,有了函式,重複地事情我們就交給它,不必擔心複製貼上的時候,手殘把裡面的程式改壞。再來,有了函式(加上良好的命名),能夠讓其他人來閱讀這段程式的時候知道要做什麼。」
Meiko:「手殘改壞,是蠻有可能的,讓其他人閱讀,我倒是沒想到,因為現在我都是一個人在做。」
Jason:「還有一個重點就是容易除錯。你想想如果同樣區塊的程式碼,散佈在不同段落之中,如果程式碼有錯的話,我們要改起來就會需要每個段落都要去更正,這樣改起來會很痛苦!」
Meiko:「這樣聽起來就蠻有說服力的。我可不想一直在做重複的事呀!」
Jason:「這樣好了,我舉個例子給你看,你先前不是有寫過一個判斷條件,幫你決定下雨是否帶傘?像這樣
rain = True
if rain:
print ("帶傘")
else:
print ("不帶傘")
我們今天如果把這段程式碼,換成用函式的方式,重新寫一次的話,就會變成這個樣子。
rain = True
def action_for_rain(rain):
if rain:
print ("帶傘")
else:
print ("不帶傘")
print (action_for_rain(rain))
Meiko:「歐,這樣看來,你好像用一個action_for_rain
把原本的描述包裝起來。」
Jason:「你可以看得出來什麼是input
嗎?」
Meiko:「就是rain
囉?」
Jason :「答對了,所以如果我們把這段程式碼執行一下就會像下面這樣
Meiko:「誒,Jason,因為你輸入的rain = True
,所以action_for_rain
會印出『帶傘』這個我理解,但為什麼『帶傘』下面還會有個『None』?」
Jason:「因為目前的函式我沒有設定回傳值。」
Meiko:「回傳值是什麼?」
Jason:「回傳值就是我前面提到函式的output
,你丟了input
到這個函式,函式處理完之後,可以丟出一個 ouptut
,讓你知道結果是什麼。像我在函式action_for_rain ()
的最後加入了一個return 0
,代表回傳一個 0 的數值。
rain = True
def action_for_rain(rain):
if rain:
print("帶傘")
else:
print("不帶傘")
return 0
print (action_for_rain(rain))
Meiko:「真的耶,這樣在『帶傘』的下面,就可以看到一個 0 了。可是 Jason,我們這個action_for_rain
的函式,我覺得回傳值應該是告訴我要不要帶傘才是啊,現在回傳 0 好像沒有什麼意思?」
Jason:「的確,看來你開始在思考函式的功用在做什麼了!我們可以設定一個變數output
,當條件成立時 output
就設定成『帶傘』,否則就設定成『不帶傘』,然後把原本在函式裡面print()
這個方式,改成直接 return
出來一個結果,像這樣
rain = True
def action_for_rain(rain):
if rain:
output="帶傘"
else:
output="不帶傘"
return output
print (action_for_rain(rain))
Meiko:「程式回傳『帶傘』,恩…這樣看起來比較符合真實的應用場景!不過,我們現在看起來好像還是在學習片段的程式耶...Jason」
Jason:「我們算是做成了第一塊積木囉...還有其他積木要做...」
我大寶寶~拉,今天介紹的函式function
的用法,基本上就是寫程式必備的能力!因為要處理的功能變多,程式的就會變得相當繁雜,透過function
的做法,感覺就像把程式整理成一塊塊的積木!要堆疊起來就變得又快又輕鬆!你可以幫忙想一下 Meiko 的車在保養廠可能會做哪些事,我們明天就會討論如何用函式來表達保養廠進行保養 Meiko 車子的工作囉...
歡迎登入留言跟我分享你的想法唷!(登入不麻煩,點一下 FB 登入就可以留言了!)
1.喜歡這樣方式學 Python 的朋友請留言『+1』
2.如果前面的內容忘記了,趕快看一下大寶寶這一系列的看對話學 Python 資料分析,用情境故事帶你入門的列表!就能夠繼續 Happy Coding 囉!