好,那麼呢,今天已經我們會用 if statement
了,這樣很棒,那我們再更進一步,我們來用 if-else
statement,它這是什麼意思啊?很多的時候呢, 我們在考慮 conditional
的狀態的時候,我們想的是 如果條件是對的,我們就這麼做,不然,我們就那麼做。
那這跟我們剛剛講的是不太一樣的哦,剛剛是說,如果條件對,我們就做,不然就跳過它, 略有一點不同。
所以呢,你如果要畫成一個這個 流程圖的話,概念大概就是,我們先做一些事情,然後呢我們來做一個判斷,
如果事情是對的,那我們就做某一些程式碼,然後往下繼續執行。
如果是錯的的話,我們就跳過某一段程式碼,然後去做後面的程式碼。
所以呢,剛剛我們用 if statement 的時候,是現在這樣的流程。
但有的時候,我們想說,誒,不要這樣,如果不對,我們要做另一段程式碼,然後再往後接。
那這個時候我們就用 if-else,所以呢 if-else 這個 statement
寫法像右手邊這樣,if 一個 condition,condition
如果是 true,如果是對的,那我們就這麼做,我們就做 statements 1,
也就是第一個批量,第一個集團的 statements。
如果不對,那我們就做 statements 2,大概是這個樣子。
那很明顯地,你的 if 跟 else 後面,一個有 condition,一個沒有 condition。
它這是當然的嘛,因為是若 a 則 a,不然就 b。
所以你的 else 後面不應該要再有 condition,如果你覺得應該要有,那就是表示你應該是用兩個
if, 而不是一對 if else。
那個別地都需要一個冒號,這個就是語法規定,沒什麼。
那最後呢,else 本人不能單獨存在,它一定要跟一個 if 接在一起。
這樣子才會正確,那這個也很合理嘛,如果怎樣就怎樣,不然就那樣,你那個"不然"不能單- 獨存在,不然
這句子就不合邏輯了。
好,所以我們來看看例子。
前面的 剛剛的那個例子是沒有錯的,但你仔細一想,誒,它其實更適合
一對 if else,而不是用兩個 if。
好,看一下差別。
剛剛的程式碼是說,誒請你輸入 好,輸入了,如果小於等於 10000,就如此這般。
如果大於 10000,就如果那般。
但你仔細一想就會發現, 不是啊,income 不是小於等於 10000,就是大於
10000 嘛, 你這裡其實不需要再寫一個 if,你在這裡寫 if else 就好了。
左邊跟右邊的程式碼就只差在藍色的地方不一樣,藍色的地方呢從 if
statement 變成一個 if-else 的 else。
也就是說,如果 income 小於等於 10000,你就這麼做, 不然你就那麼做。
所以右手邊的寫法是用 if else 來寫的,那左邊 右邊都是對的。
都是對的的時候,你就想了,到底要寫哪一個比較好呢?
好,那這個就是你越學越多的時候,你會漸漸遇到的困擾或者說是挑戰。
同樣的一個 任務,有很多不同的寫法,那這跟你的生活是一樣的嘛,
你同樣要辦一個活動,同樣要從某地到某地, 做一件事情有很多種做法,有的時候呢
a 方法是比 b 方法好的, 那這個時候你當然就要選 a 方法,讓你的效率提高,成效變好等等。
那以這個例子來說,同樣一個任務,同樣一個運算,我有兩種寫法,
兩種算法,那哪一種比較好呢?在這個例子裡,這個答案是容易回答的。
就是右邊這一個,為什麼?我們這個程式這樣執行啊,如此這般地執行下來,到了這個 if
statement 的時候呢,either 是這個條件會成立,那我們
就做 statement 1,或是我們會直接做 statement 2, 我們這個兩個會挑一個。
但左邊的 statement 呢,如果 今天這個條件 income
是小於等於 10000 的,
那你明明就知道它不可能大於 10000,你卻還是會在藍色的這句話重新叫它做一次
比較,那不是浪費時間嗎?如果剛剛已經做了這個 statement,那第二個
if 不可能會成立, 但你卻去判斷,那就是浪費時間。
如果你今天程式只執行一次,那倒也就罷了,但如果你
希望你寫的程式被很多人拿去用,然後呢被大量的使用者在短時間之內大量地使用, 那這個時候效率就會出問題了。
那大家可以想象一下,比如說偶爾你也會聽說有一些 訂票網站,大量的
user 湧入,然後就塞爆了,或者 是訂票可能是訂演唱會啊,訂車票啊都有可能。
大量的 user 一湧入,那個系統就爆了,這個可能有很多 理由啊。
比如說,可能是頻寬的關係,可能是電腦太老舊, 但不無可能是程式沒寫好。
同樣一個小小的程式,在這裡和這裡 它們就有浪費時間與否的差別。
如果你真心希望你寫的程式將來被很多人使用的話,
那這種效率上的小細節就需要煩惱,那這個就是寫出對的程式和寫出好的程式之間的差別啦。
那你初學的話,當然就是你程式只要能對,就謝天謝地了。
但你應該會漸漸地希望自己的程式可以越寫越好, 這樣子你才會持續地進步。
所以,總結來說啊, 這個例子,以這個例子來說,你就是應該要寫
if else 才是一個 最合乎邏輯,也最有效率的做法。
那最後還有一個 事情想要透過這個 example
告訴大家,左邊這個寫法不但沒效率, 而且它有第二個缺點,就是你在這裡
這兩個條件必須要完全互斥才可以,對吧? 如果你這裡寫
10000,這裡不小心寫成 1000 的話,那這個程式事實上 就錯了。
你如果寫 if else 的話呢,你其實不用擔心這件事情,因為你只有一個 condition,
這個 condition 長怎麼樣,就會影響 else
的條件,你不需要像左邊這樣子費心去 確保你這兩個 if 的判斷式是完全互斥的。
比如說,今天我們這個國家假設是用 10000 當標準,如果有一天,我們忽然改成
20000 的話,那你就必須要保證你這裡和那裡都有改到。
要是你只改了其中一個地方,你的程式就是錯的了,所以我們在寫程式的時候,經常要注意這- 些事情。
我們知道我們寫的程式有一天可能會被修改,那你要避免將來修改的時候呢
錯過一些事情或者忽略一些事情,而導致了不一致的狀況。
那這個東西我們在術語上 我們叫它 potential
inconsistency,潛在的不一致。
今天我在這裡寫 program 的時候呢,左邊這個程式完全是對的,但它有 potential
inconsistency, 它潛藏著某一個未來可能會出錯的機會,相較於右邊這個 就比較不好。
我們寫程式的時候,要盡量避免 potential inconsistency。
所以在這個例子裡,也是右邊的寫法是比較好的。
那這個還有,以後還有很多例子,我們會盡可能地告訴大家,讓你寫出有效率,以及 比較好,比較沒有
potential inconsistency 的程式。
好,最後提醒大家一下, 你呢,寫 if else,很顯然地,if
跟 else 要排在同一排,才表示它們是地位是相同的,
如果你像現在這樣子寫,把 else 放在 if 裡面縮排的話,很明顯地就不對。
if else,else 如果要存在,一定要有相對應的
if, 那個所謂的相對應,一定是在同一個 level 上相對應,所以以左邊這個
program 來說,這個 else 就找不到相對應的 if,因為在同一個
縮排底下沒有,那這個情況下呢,這個程式 就是錯的了。
所以這個就是再次跟大家強調一下,在 Python 裡面
寫作的時候呢,縮排是很重要的,該排在同一排的就要排在同一排。
if else 就要排在同一排,然後呢 if 裡面的東西,else 裡面的
東西就要缩成一樣長,程式才能夠正常地運作。