[音樂] [音樂]
[音樂]
[音樂] [音樂]
[音樂]
好的,那我們繼續 介紹 Conditionals。
那我們之前的學習已經告訴我們,我們有 if 或者是 if else。
我們可以寫這樣子的 Conditionals 條件判斷來控制我們程式運作的邏輯或者是運作的流程。
那我們還有更多東西,我們在這裡來介紹一下。
首先呢,要讓我們的程式更強大、 能夠處理更多狀況的話,我們需要 Nsted if-else。
這是什麼?Nsted if-else 的中文叫做巢狀的 if-else。
那巢狀是鳥巢形狀那兩個字,它的意思大概就是說,外面包著裡面
裡面又包著裡面,長得有點像是層層疊疊的鳥巢,這樣子。
所以叫做巢狀。
那麼呢,今天如果我把一個 if 或者 if-else 的 statement 放在一個 if
block 裡面的話,我們 就說這是一個巢狀結構,長得像右邊這個樣子。
大家可以看到 第一個階層有一對 if-else,而在 if block
裡面 又有另一個 if-else,那很自然地這就是我們說的巢狀結構啦,外面的 if-else 包著裡面的 if-else。
那在這個情況下,程式會怎麼樣地運作呢?首先 如果第一個
if-else 的 condition one 是 true,那就會跑進第二個 if-else, 它就要去判斷 condition 2 是不是 true。
那麼在這個例子裡,如果兩個都是 true,我們就會 去做 statements A,對吧?true
又 true,就會做 statements A 嘛,但是如果 true 完了以後是 false condition
1 是 true,而 condition2 是 false 的話,就會變成是做 statements B,那最後如果
condition1 自己直接就是 false 那我們就會做 statements C
啦,就直接會跳到 else 來,就根本就不會去看 condition 2。
那麼 if 或者是 if-else 的statement 當然不是只能放在 if
block 裡面,你也可以放在 else block 裡面,好所以,else block 裡面也可以裝 if-else。
那另外呢,就是你這件事情要包幾層都可以,像這個例子是包兩層,你也可以包三層、 四層、 五層、 八層 十層都可以。
但一般來說,不會包得特別多啦,你沒事的話,大概三層、 五層就已經很複雜了。
好,所以呢,大概是我們會想要使用 合理的層數,而不是包的比較多就比較厲害。
那你很快就會發現你只要寫稍微複雜的程式的話呢,包到三層五層是蠻常見的。
好,那我們很快地來看一個例子。
這個例子是說啊 給你三個整數,能不能請你幫我判斷誰是最小的。
所以比如說,如果我輸入 5/3/8 那我們就要印出
3,輸入 3/5/8 就也是 印出 3,因為 3 是最小的嘛。
那麼我們今天呢,因為有三種情況,很自然地 你就會用 Nsted
if-else 啦,因為你只有一個 if-else 的話,你只能判斷兩種情況嘛。
那可是今天有三種啊,那你自然就用 Nsted if-else,那我們來試試看,首先呢
我有三個變數 abc 都是整數,因為使用者輸入一個數字以後,我們把它轉成整數。
然後存到 abc 這三個變數裡面去。
接著呢,我們就 順序可以自定嘛。
所以我們在第一層的 if-else,我們就說,欸那不然先把 a 跟 b 拿來比比看吧。
如果 a 小於等於 b,那表示什麼呢?表示 b 不是最小的。
那這 個情況下,我們基本上就不用考慮 b 了。
所以呢,我們就說,欸 如果是如此,就把a 跟 c 拿來比較吧,那
a 跟 c 又再比一次,如果 a 小於等於 c,那這樣就 OK 啦 a 就是最小的。
不然的話呢,那就是 c 最小,因為我們在第一輪的時候已經淘汰 b 了嘛。
所以 a 跟 c 比,誰比較小誰就是最小的。
那如果第一輪比的時候呢 a 是大於 b 的,那當然就是 a 不可能是最小的。
那這個時候,在 else 裡面的 if block 我們就變成要比較 b 跟 c。
b 如果比較小,那就是 b 最小;c 如果比較小,那就是 c 最小啦。
那麼大家 也看一下我們這個 print statement,基本上就是 a 是一個整數。
後面是一個字串,所以呢,它用逗點隔開,程式會自己把它們個別地都變成字串
然後插空格,然後綁在一起,然後輸出,所以這個大家都可以理解。
好,我們來試一下。
[空白_錄音]
好,今天呢,我們來試這個程式的話,比如說 5
3、 8,這個時候呢,它說 3 是最小的,那看起來沒問題,對吧。
或者呢,我們說 3/6/12。
欸,這個時候呢,你看到了一個這個錯誤訊息,這是為什麼是錯誤訊息呢? 它跟你說的是啊,invalid literal for
int (),好那你要仔細看一下程式碼發現,哦 我們這個
input 它會把使用者輸入的東西 當成一個字串吃進程式裡面,那這個字串是用什麼東西分隔的呢?是用
enter 嘛 是用你按換行的時候,所以這個 input
事實上讀到的是 3 空格 6 空格 12 這麼多東西。
那含著空格的這個奇怪的字串沒有辦法被轉成 int。
所以,這句話它才會跑出這個 wrong time error。
那這個是因為我們輸入的格式不符合程式寫作的規範。
好,所以我們來重打一次。
怎麼打呢?我們應該打 3、 6、 12 這樣才對嘛。
好,這樣子才會 3 這個字串被轉成整數給 a,6 給 b,12
給 c, 然後程式就可以正常運作啦。
好,那麼這裡有幾個 question 請大家稍微想一下。
今天呢,我們三個數字如果都不一樣,那顯然程式應該是沒有什麼問題。
但如果我們有複數個數字同時都是最小值的話 我們的程式還能夠找出最小值嗎?答案是可以。
但是請大家 對著這個程式碼,仔細地丟幾個例子,你自己跑跑看。
看看它能不能真的找出最小值,以及是為什麼。
好,這個不是很難,請大家想一下就可以啦。
第二個問題就是現在這個寫法是對的,那有沒有更好的寫法呢?
答案的確是有,那我們來看一下。
今天這裡有兩個 跟剛剛不太一樣,雖然邏輯上幾乎相同,但是跟剛剛不太一樣的寫法。
好,我們先看第一個。
第一個呢,我們除了 abc 以外還多宣告了一個變數叫做
min,然後我們一開始 說它是 0,接下來我們這裡幹嘛呢?好,這個的邏輯
跟剛剛幾乎一模一樣嘛,如果 a 跟 b 比完了以後 看我們是要把
a 刪掉,還是把 b 刪掉,我們在裡邊再做一次比較,但是我們
現在做的事情是當我們找到誰最小了以後,我們就把它assign 給 min
也就是說,這整段程式碼跑完了以後,我們會在 min 的這個變數裡面,一開始是
0; 但是這 if-else 跑完了以後,它就會被填入最小的那個值的多少、
的那個大小,所以我們最後只需要一個 print statement 就好了。
不像剛剛我們要寫四次 print statement,現在我們只要寫一次就好了。
那你就說啦,欸老師啊,這個差別在哪裡。
好,首先程式碼看著比較清爽嘛。
這個通常不是什麼壞事。
其次就是這裡後面這一段話,你不需要重複四遍,只要你
在你的程式碼裡面有某一段程式碼是一模一樣,然後你
複製貼上負數似的,那這個時候就會有我們之前跟大家說的 potential
inconsistency,好,potential
inconsistency,對不對?如果 我這個 print
statement is the smallest 重複四遍 那要是今天你的老闆跟你說,欸,把這個句子換掉吧,不要叫它
is the smallest,叫它 is the minimum 比如說。
那你要是有一個地方沒改到的話,不就慘了嘛。
所以盡可能地 避免 potential inconsistency,那麼現在左邊這個寫法 就有這個好處。
好,那我們來看看右邊這個寫法 右邊這個寫法又是從左邊改良來的。
它呢,一開始不設 min 是 0,而是設 min 是 c
也就是說我給你三個數字,我先預設,我先假裝 min
就是 c,然後我再看看有沒有人要叫我修正我原本的猜測。
我先假設 min 是 c,那如果 a 小於等於 b,a 又小於等於 c
的話,我就知道 啊,剛剛搞錯了,那這時候我就說 min 是 a。
不然的話,我就看如果我發現 min
是 b,我就把它改掉,所以你仔細比較一下左邊跟右邊的話,就是把這個刪掉,
然後把這一個刪掉,對吧?因為左邊呢,在某兩種情況下 我會發現是
c,那我既然右邊一開始就先預設是 c 的話 那左邊的兩種是 c 的情境下,我就不用做任何事情了。
好,所以右邊又會比左邊跑起來稍微再快那麼一點點。
那如果你要做大量運算的話,這個東西的差別就會顯現出來。
所以呢,你可以看到 又是一個例子。
就是同樣是一個任務,可能有不同的寫法,而且有好壞的區別。
可能有是否易於維護的區別,可能有效率的區別,好,供大家作參考。
最後,提醒大家一下因為我們現在寫了 if-else,
而且我們有成對的 if-else,有複數個 if-else 包來包去的,所以它們之間的關係大家必須要小心。
規則是什麼呢?Python 的規矩就是一個 else
它永遠都會跟它同一個階層的 if 做配對。
那有了這個概念了以後 呢,可以幫助我們解讀,比如說這個程式跟這個程式,先看左邊這個吧,如果
a == 10 如果 b==10,我們就印說,嗯,a 跟 b 都是 10,那這個 OK 嘛。
那這個 else 就會說 a 不是 10,那為什麼我們會這樣講呢,就是因為
這個 else 跟這個 if 是同一個階層的,所以它們兩個
要配在一起,如果第一個 if 是 false 就直接印 a 不是 10,跟 b 就沒有關係啦。
那右邊這個程式呢,右邊這個程式跟左邊這個程式的差別就差在 這個
else 以及 else 底下的這個敘述,被往右推了
一個階層,所以那這個情況下我們的 else 會變成跟裡面的 if
做配對,好,那這個是 Python 必須要設定的規則嘛,不然你哪知道這個 else 要跟哪一個 if 做配對。
好,所以這個情況下呢,會變成跟裡面的做配對。
那麼,你這個程式就有一點怪了,先知道 a 是 10,然後跑進來,結果最後呢,你可能會印出 a 不是 10。
那這個問題就很大,所以從某個概念上來說呢,左邊的程式
如果說我們它說它是對的,那右邊的程式就是 Logical error。
好,因為你的 else 不應該寫在這裡而是應該寫在前一個階層才對。