Meiko 的車到保養廠,進行檢查,看是否要換輪胎、換機油、和換雨刷。Licensed by Adobe Stock
Jason:「有時候,我們可能會回傳多個值,比如說我們先前有提過的布林值bool
的 True
或False
,這樣使用完這行程式之後,如果還有其他的程式區塊需要這個 action_for_rain
的執行結果,我們就會return
一個以上的值。像這樣
rain = True
def action_for_rain(rain):
if rain:
return True,"帶傘"
else:
return False,"不帶傘"
is_rain,output=action_for_rain(rain)
你看,這次我們在 if-else 的判斷條件中,直接 return 了兩個參數,一個是布林值 True 或 False 另外一個是『帶傘』或『不帶傘』。」
Meiko:「對耶,而且你在輸出的時候,還把它們分別指定到兩個參數is_rain
和 output
。」
Jason :「對啊,因為這樣之後,我們就可以拿is_rain
和output
做別的應用了!如果我們把它們印出來的話會看到
rain = True
def action_for_rain(rain):
if rain:
return True,"帶傘"
else:
return False,"不帶傘"
is_rain,output=action_for_rain(rain)
print (is_rain,output)
Meiko:「Jason,但是這只有一個函式而已,好像沒什麼感覺耶?」
Jason:「不然,我們來想一下,你的車保養會做哪些服務好了,我用這個來發想。」
Meiko:「這倒簡單,你看這張單子是剛剛服務人員給我的保養記錄表,詳細記錄了車子做了哪些保養,你看...」
Jason:「好唷,這表示你的車子進到保養廠可能到了 3 個不同的保養區進行檢查。那我就用tire_replace
代表輪胎的更換,engine_oil_replace
代表機油的更換和wiper_replace
代表雨刷的更換!」
Meiko:「還真的可以喲?」
Jason:「對啊,不過就是要做一些條件設定就是...tire_replace
有一個 input 是 milage 代表里程數,換輪胎的條件是超過 30000公里就會換輪胎。」
Jason:「然後,engine_oil_replace
有一個 input 是 oil_need_replace
,基本上只要進保養廠就是車子儀表板顯示機油要更換了。」
Jason:「最後一個 wiper_replace
有一個 input 是 wiper_years
,一般來說,3年左右橡膠就會開始硬化,我們這個地方又多雨,保養廠建議 3 年換一次。」
Meiko:「這樣好像都有提到了耶!」
Jason:「那我們就先分別把個別的函式寫出來吧!你先寫換輪胎的函式...」
Meiko:「是要回一次回傳 2 個值的函式嗎?」
Jason:「歐,對!差點忘了跟你說,你試著 return 2個值,一個是布林值,另外一個是個 output 的字串。」
Meiko:「Okay,那tire_replace
應該是這樣...」
def tire_replace(milage):
if milage > 30000:
return True,"換輪胎"
else:
return False,"不換輪胎"
Jason:「不錯耶,那你可以繼續寫engine_oil_replace
...」
Meiko:「換機油的好像是一個預設條件,只要成立就...換機油..」
def engine_oil_replace(oil_need_replace):
if oil_need_replace:
return True,"換機油"
else:
return False,"不換機油"
Jason:「答對了,那最後一個是雨刷如果超過 3 年的話要更換,你會怎麼寫?」
Meiko:「應該是有一個參數配上一個比較>=
3 吧?」
def wiper_replace(wiper_years):
if wiper_years>=3:
return True,"換雨刷"
else:
return False,"不換雨刷"
Jason:「沒錯唷!看來你 3 個函式都寫好了,那我來幫你整理一下完整的樣子...
milage=30050
oil_need_replace = True
wiper_years=2
def tire_replace(milage):
if milage > 30000:
return True,"換輪胎"
else:
return False,"不換輪胎"
def engine_oil_replace(oil_need_replace):
if oil_need_replace:
return True,"換機油"
else:
return False,"不換機油"
def wiper_replace(wiper_years):
if wiper_years>=3:
return True,"換雨刷"
else:
return False,"不換雨刷"
is_tire_replaced, tire_output=tire_replace(milage)
is_oil_replaced,oil_output=engine_oil_replace(oil_need_replace)
is_wiper_replaced,wiper_output=wiper_replace(wiper_years)
print (is_tire_replaced,tire_output)
print (is_oil_replaced,oil_output)
print (is_wiper_replaced,wiper_output)
Meiko:「歐,這樣好像就比較有感覺了耶,Jason,照著我這份保養紀錄單寫了一份程式,我的車跑了 30050 公里,所以要換輪胎。」
Meiko:「接著進到保養廠就要換機油,所以顯示換機油,因為我的車還很新才 2 年而已,所以暫時不用換雨刷。這些結果印出來跟我保養紀錄單上的結果是一樣的!」
Jason:「答對了,看著你漸漸有寫程式的思維了,一步步的把每一件事情都想清楚!」
Meiko:「我也好像有點感覺了!Jason 你剛跟我說程式變多,一冗長就會有很多資訊,不容易維護,現在我大概可以感覺得到了!」
Jason:「是啊,現在我們只有 3 個保養的函式,如果你的車在開久一點的話,需要保養的項目很多,要在程式上顯示出來,就真的會眼花撩亂了!」
Meiko:「對呀,有了函式,處理這些複雜的程式碼,還是可以像現在坐在保養廠的休息區喝咖啡,享受一下悠閒的時光!哈!」
我大寶寶~拉,今天繼續介紹函式function
的用法,有沒有發現我們把汽車保養廠裡面的步驟描述出來,再轉換成程式碼也是蠻有意思的啊?這就一種程式撰寫抽象化的過程,大寶寶把實體世界的行為,轉換成程式邏輯,這樣就可以讓電腦去進一步幫我們判斷囉!
歡迎登入留言跟我分享你的想法唷!(登入不麻煩,點一下 FB 登入就可以留言了!)
1.喜歡這樣方式學 Python 的朋友請留言『+1』
2.如果前面的內容忘記了,趕快看一下大寶寶這一系列的看對話學 Python 資料分析,用情境故事帶你入門的列表!就能夠繼續 Happy Coding 囉!