為孩子寫一本編程書系列:學習函數 將命令打包
在上一節中,小Ian已經熟悉了使用命令來解決一些簡單的編程挑戰。雖然只是在Playground中將moveFoward()、collectGem()、toggleSwitch()這些簡單的命令進行組合并執行,但看得出,在每一次完成一項編程挑戰游戲的過程中,孩子的編程思維也正被逐漸地構建起來。而在這一節里,我們將介紹編程學習中另一個重要工具——函數。
認識函數
在我們的日常生活中,即使是一個最簡單的任務,也是由由一系列步驟,按照一定的順序組合而成的。比如,我們每天都會做的系鞋帶這個動作,也可以將它分成三個步驟來完成。
每雙鞋都有兩只,因此同樣的過程,我們需要重復執行兩遍。想象一下,如果我們用上一節學過的命令方式,去讓計算機完成系鞋帶這個任務的話,是不是應該需要輸入下面這6條命令呢?
但想一想,當我們穿鞋時,其實并不是按照這些指令來完成穿鞋這個任務的。在我們的腦子里只是記住了系鞋帶的步驟,然后每次需要穿鞋系鞋帶時,就將這些步驟從腦袋里拿出來,應用到穿每一只鞋子上。那么,同樣的,有沒有一種方法能夠讓計算機記住這些步驟,并在需要的時候去使用它呢?這里,我們就需要用到一個新的工具——函數。
函數能夠將一組命令打包,并給它賦予一個名稱。而這一組命令便可以在需要時通過這個函數的名字進行調用。
定義函數
讓我們仍以系鞋帶為例,看看如何通過定義函解的方式,讓計算機記住系鞋帶的步驟:
- 首先我們通過 func 關鍵字來聲明一個函數
- func后面跟著的便是我們給函數起的名字,上面這個函數的名字叫做tieMyShoe——系我的鞋帶,和之前提到的命令一樣,我們也在函數的名稱后面加上一對括號。
- 我們使用一對 花括號{} 來定義函數所包含的內容,我們也稱它為 函數體。通過將命令添加到函數體中,便能給這個函數添加我們所希望的行為。
調用函數
我們定義函數之后,計算機并不會自動地去執行它。而是需要我們明確地告訴計算機在何時何地去調用它。我們通過函數名來調用并執行它所打包的那一組命令。這里,我們便通過調用兩次tieMyShoe()函數,完成給兩只鞋系鞋帶的任務。
Tips:理解函數的定義和調用之間的關系非常重要,函數用來打包命令,但在定義后并不會被直接執行,只有在通過函數的名字調用它們時,函數體內的命令才會被執行。
通過函數簡化問題解決
函數是程序員們編程時最常使用的工具,但對于初學者來說,他們卻往往難以判斷什么時候應該使用函數,因為,大部分情況下我們同樣能通過組合命令來解決問題。下面是那些最常見的函數使用場景,而其中第二點又是這些場景中最常見的:
- 當需要通過組合已有的命令,來創造出新的或更復雜的行為時
- 當某一行為可能被重復或多次使用時
- 當某一行為變得太過復雜時,也會將它分解成多個更小的行為
下面還是讓我們回到Ian最喜歡的Playground中,去看看我們如何通過函數去解決那些復雜問題。在這個挑戰游戲中,我們需要幫助Byte抓到全部4顆寶石,并打開4個開關。
Ian一眼就看出了這個迷宮的規律,4個寶石和4個開關,平均分布在迷宮的4條邊上。每一條邊上的寶石和開關都在相同的位置上。因此,我們只要定義一個函數去解決一條邊上的寶石和開關,然后重復調用四次便可以完成這個編程挑戰了。讓我們為這個函數起個名字,就叫它resolveRow()吧。
瞧,我們剛剛成功完成了這個編程挑戰,比起我們光用命令去實現所需要的27條命令,使用函數的方式是不是簡明了很多呢?上面的這個編程挑戰,并不是Playground中函數這一小節的***個編程挑戰,但我們在這個挑戰游戲中所運用的方法,卻像極了那些程序員們在日常工作中,解決問題時所普遍采用的思路:
- 首先明確任務的目標:抓到所有寶石、打開所有開關
- 分析問題,盡可能地通過識別模式,將較大的問題分解為一個個小問題:這里的小問題就是解決一條邊上的寶石與開關。
- 為每一個獨立的小問題找到解決方法:通過定義函數resolveRow()來處理一條邊上的寶石與開關。
- 通過將這些小問題的解決組合起來,解決整個任務所包含的大問題:通過調用4次resolveRow()函數,完成挑戰。
Tips:這種解決問題的思路和方法,不僅在編程中普遍應用,也同樣適用于幾乎所有學科和領域。孩子們在學習編程的過程中,實際也是在學習問題識別、分解和解決的方法,這對他們盡早培養起獨立解決問題的能力非常有幫助
小節
通過這一節的學習,我們認識了編程中的函數,通過定義函數,我們用一個名字來指代一組命令所包含的行為。并在需要時,通過對這個函數名的調用,告訴計算機去執行這一組命令。另外,我們還學習了如何將大問題進行分解,并通過定義和調用函數來解決問題的方法,這一方法將始終貫穿于我們日后的編程實踐當中。在下一節,我們將會學習編程中的一個重要控制邏輯For循環。
練習
請大家完成Playground中,Funcations這一節中的其他編程挑戰,它們包括:定義一個新的函數;在函數中添加命令以創建新的行為;函數間的嵌套調用;通過函數解決復雜問題等等。完成這些練習后,你將會對函數的使用有更深入的理解,這也將是你未來構建更強大應用的基礎。
【本文是51CTO專欄作者“陳逸鶴”的原創文章,如需轉載請聯系作者本人(微信公眾號:techmask】