[DA series - Learn Python with Steem] 是DA(@deanliu & @antonsteemit)關於「從Python程式語言實做Steem區塊鏈的入門」的系列,歡迎趕緊入列學習!
前情提要:[DA series - Learn Python with Steem #05] 基本資料結構
第#06堂課,今天我們來學習Python的~~函式 !
Python的函式 (Function)
前面我們介紹完了Python基本的變數、迴圈、資料結構以及if - else判斷等等,其實結合起來已經可以做很多很多事情囉。今天我們要提的一個新概念就是Function,這算是寫程式必備的元素,雖然聽起來很Fancy但其實一點都不,它的功能是可以大大簡化我們的程式,增加易讀性。
Function 函式
何謂Function?在一個程式的運作過程中,我們可以把Function看做成一個「讓我們人生變簡單的東西」。例如我們之前教過的print()
就是一個基本的Function,只要在print()裡面輸入想要顯示的變數等等,就可以輕鬆的把這個東西印在螢幕上。但大家仔細想想會覺得神奇,print()
裡面究竟是什麼神奇的魔法,可以把東西以正確格式顯示出來到螢幕上呢?答案是,我不知道,我也不需要知道。這就是一個Function,每當我們要印出一段字的時候,我們不用寫一大段複雜的程式碼來執行,只要透過包好的這個function,輕輕鬆鬆打一個print()
就完成了。
寫程式一直在複製貼上?代表你該用function了!
為什麼需要這樣的東西呢?設想,如果每一段print()函式的原始程式碼有100行,難道我們每次要輸出東西時都要重複打這100行嗎?這樣我們如果要輸出十筆資料就需要1000行了。所以寫程式的人喜歡把這些常用的東西寫成function,像python為了我們的方便就幫我們設計了print()
,而我們在自己的程式中,也可以設計將自己常常重複使用的東西寫成function。這樣我們就可以在自己的程式中不斷重複利用。
以下是一個簡單的小例子:我們想要設計一個程式,顯示出一個人的基本資料。我們可以自己定義這樣一個簡單的Function,接這就可以不斷的重複利用:(今天的範例程式碼可以至tutorial_6.py中參考喔!)
可以看到第一行開始def
(definition,定義的意思)的地方開始,就是我們定義function的地方。當我們要定義function的時候,我們首先要想好這個function的輸入是什麼,也就是這個function的參數(parameters)。在這個例子中,我們的參數就是名字、年齡以及國家 (接在我們function名字後面括號裡的(name, age, country)
),這些是會改變我們Function產出的東西。
接著我們的function就可以拿這些輸入值來做他想做的事情。最後如果有需要,還要讓function回傳一個或多個值。在我們這個case裡,只有基本的列印功能,最後也沒有要回傳,因此這樣就可以拿來使用了。
可以看到我們後面的程式中,就只要用三行呼叫我們定義的Function名字,就可以執行裡面的動作。我們呼叫自己的function時,也要放入(name, age, country)相應的變數作為Function的參數,他們才能順利運作:如: print_basic_info('Anton', 22, 'no where')
執行結果:
1 | My name is Anton |
可以看到,Function的魅力在於他可以讓程式碼看起來更簡潔。在主要執行的程式裡,我們透過Function name (print_basic_info())來讓人一看就知道我們這一步是要做什麼。當然print_basic_info這種函式可能大家看了還是不知道你要print什麼,但如果是其他函式如:計算BMI、計算最大公因數等等、讀者能夠比較輕易透過function name知道你想要幹什麼。假如我們沒有使用function把這些部份分離出來的話,不但像之前說的一樣,每遇到一次要重新打一次,而且還會讓整個程式碼看起來亂糟糟的,因為大家都不知道現在發生什麼事了。
在程式設計裡,有一個重要的概念就是「模組化」。基本概念就是,我們要將我們常使用的不同功能設計成分開的「模組」,再由這些小元件(小function)組成各式各樣的大function,最終組成我們的程式碼。我們用之前做過得BMI例子,再透過「function」的概念重組一遍給大家看:
這段程式之中,我們先透過input取得我們想要的資訊並轉換成float (浮點數,有小數點的數字)後,就丟到我們先寫好的calculate_BMI()
這個function裡面計算bmi。這個function就是我們說有回傳值的function,可以看到最後面有一個return,是一個python的保留字,表示function到此結束,並且把bmi
這個變數回傳到呼叫這個function的地方。因此在我們主要程式碼的地方可以寫成
1 | bmi = calculate_BMI(user_height, user_weight) |
就像我們說 x = 1, my_name = 'anton'
一樣,我們現在可以把右邊function算出來並回傳回來的值賦予給bmi。這就是function有回傳值的用處。而我們的最後一個function: print_warnings就跟最前面的例子一樣,只是要依照bmi不同,列印出不同的訊息,並不需要回傳值,因此在call最後一個function時不用寫什麼東西= 這個function,而是直接呼叫就可以了。
執行結果:
1 | Please enter your height: 1.78 |
其他的function架構
當然這樣子的設計只是我開心而已啦!有些人不喜歡在function裡面列印任何東西,也可以把最後一個function設計成回傳message,而在外圍主程式部份設計成
1 | warning_message = get_warning_message(bmi) |
這樣的架構。不過這些就是個人習慣了,大家可以看看哪樣看起來比較順暢xD。今天介紹Function也就到此先告一段落了。簡單的說,在自己的程式中設計function,可以很好的增加自己程式易讀性,重複利用寫過得code,否則你寫的艱難,別人讀的也艱難呀!
Homework time:練習題!
今天我們來練習寫個簡單的function吧!來設計一個叫做my_average()的Function,輸入值為一個list,而輸出則為這個list扣除最大值與最小值之後,剩餘數的平均值。範例輸出輸入:
1 | my_list = [1,8,3,6,2,345,-23,7] |
我們下篇文章再見囉~下課!
image - pixabay
This page is synchronized from the post: ‘[DA series - Learn Python with Steem #06] 函式’