今天我們進入“返回”小鎮的后7關,即第159關至第165關。
應某公號粉絲要求,第162關有更仔細介紹。
先復習一下基礎知識:
基礎知識
“返回”在編程中經常用到。是每個函數必備的一部分,在我們寫完一個函數的時候,我們都習慣性地會在函數最后一行寫上return。比如:
return;
這樣就不返回任何值。當函數是一個判斷函數的時候,就可以讓函數返回判斷的結果,比如
return yes;
或者
return no;
當然,我們也可以直接返回一個判斷語句,比如:
return banana.rotten()
來判斷香蕉是否壞了,如果香蕉壞了,banana.rotten()=yes,否則banana.rotten()=no。
下面進入關卡~
第159關
return的意思就是返回,既然函數已經返回了某一個值,就不會再執行return之后的操作。
在上圖右側的代碼區域內,return no之后就不會再執行return yes。
因為我們需要小猴子goto banana,所以foo()函數返回的應該是yes。
修改后的代碼如下:
點擊運行看效果!
第160關
在這一關里,我們需要say something來嚇跑烏鴉!
在上圖右側的代碼框里,我們已有兩行代碼嚇跑烏鴉,但是在嚇跑烏鴉之后呢?
當然是讓小猴子goto banana啦!
在第3行上加上一行代碼就可以啦,如下:
點擊運行看效果!
第161關
有的時候,烏鴉耳朵有點背,所以小猴子需要不聽地say something,直到烏鴉被嚇跑為止。
我們可以用crow.watching()這個函數來判斷烏鴉是否在看著小猴子,既然crow.watching()函數是判斷語句,那么crow.watching()函數自己就會返回yes或no。
當烏鴉被嚇跑之前,crow.watching()函數返回yes,那么not crow.watching()返回的就是no。這個時候,safe()函數返回的是no。小猴子需要一直say something,直到烏鴉被嚇跑。
當烏鴉被嚇跑之后,crow.watching()函數返回no,那么not crow.watching()返回的就是yes。這個時候,safe()函數返回的是yes。
我們可以把代碼改成:
點擊運行看效果!
第162關
在上圖中,我們看到有兩只烏鴉,那么很簡單地,我們可以把上一關的代碼借鑒過來,就有一個這樣的safe函數:
在這些代碼后面,我們需要寫入判斷小猴子是否可以走向香蕉的代碼,如下:
點擊運行之后,我們先不看效果,先看結果:
只得到了兩個星星!
這是因為我們用到了很笨的方法,用了過多的代碼。
而系統要求我們用6行或者更少的代碼,才能得到3個星星!
其實我們可以壓縮safe函數。
在原來的safe函數,我們用了4行來判斷兩只烏鴉是否在看著小猴子,這是極其浪費的。
事實上,我們可以用一行就夠了。
怎么寫?
還記得我們之前學到的邏輯語句嗎?and? or?not?
因為我們要判斷兩只烏鴉是否同時都飛走了,所以我們需要用and連接兩個判斷語句。
即crows[0].watching() and crows[1].watching()。
當crows[0]和crows[1]都飛走了,那么我們有crows[0].watching()=no和crows[1].watching()=no,等價于not crows[0].watching()=yes和not crows[1].watching()=yes。于是我們有:
not crows[0].watching() and not crows[1].watching()的返回值是yes。
(yes and yes=yes,no and no=no,yes and no =no, yes or no = yes)。
下面是我給出的代碼:
點擊運行看效果!
這時候可以三星通關!
第163關
上圖中的場景和前幾關類似,只是香蕉編程了3個。這一關里,我們對香蕉可以用for循環。
不過我們還是要在第2,3行里寫入判斷烏鴉是否都飛走的代碼。
修改后的代碼如下:
點擊運行看效果!
第164關
這一關里,我們看到由三只烏鴉,這其實和前幾關沒有什么區別。
我們可以用
nor crows[0].watching() and nor crows[1].watching() and nor crows[2].watching()
來判斷三只烏鴉是否全都飛走了。
上圖右側的代碼區域如下:
修改后的代碼如下,事實上,我們并不需要判斷三個烏鴉是否全都飛走了 ,在這個代碼里,我們只用判斷烏鴉0和烏鴉2都飛走就可以了(大概是因為烏鴉按照順序飛走吧),但是在現實的情形中,我還是強烈建議用
return nor crows[0].watching() and nor crows[1].watching() and nor crows[2].watching()
來代替如下代碼框里的第3行。
點擊運行看效果!
第165關
可是如果有很多只烏鴉怎么辦?比如上圖中有5只烏鴉,難道我們要用
nor crows[0].watching() and nor crows[1].watching() and nor crows[2].watching() and nor crows[3].watching() and nor crows[4].watching()?
這樣的代碼嗎?
那如果有100只烏鴉怎么辦?
答案是,該用for循環的時候,就用for循環,循環是一個好東西。
比如在如下的代碼框里,我們就可以用for循環對烏鴉進行遍歷,對每一只烏鴉,我們都可以判斷其是否在看著小猴子。
如果烏鴉c在看著小猴子,那么c.watching()=yes.
這時候,小猴子是不能走動的,所以如果c.watching()=yes,那么safe函數應該return no。
修改后的代碼如下:
點擊運行看效果!
好啦,到現在為止,return函數的全部15關都介紹完了。
下一次,我會給大家介紹成功的“鑰匙”這一部分,一共14關,我會分2次教程介紹,每次包括7關。
順祝大家父親節快樂,過兩年我應該也可以過上這個節日了。
(關于我構思的機器學習的介紹會在以后的文章中給出,會從分類和回歸這兩個部分講起。希望大家會喜歡。)