向左走向右走 - 條件判斷式 ========================= 在我們的日常生活中總會遇到需要見機行事的時候,例如今天天氣冷的話就吃火鍋,否則就吃便當,或是今天如果預報下雨機率大於百分之四十就帶傘,像是這類的判斷,在程式語言裡也有類似的寫法,我們稱之為條件判斷式,以下就讓我們看一個簡單的例子 .. code-block:: python num = 5566 print 'The number is', num if num == 5566: print "I love 5566" 從第二行就是條件判斷式,如果num相等於5566的話,就會印出 :: The number is 5566 I love 5566 如果數字是1234因為不相當於5566的話,會印出 :: The number is 1234 那因為我們一開始就把num指派為5566,因此輸出的結果就是 :: The number is 5566 I love 5566 現在,你可以試著把程式碼第一行的num從5566改成其它數字 .. code-block:: python num = 7788 print 'The number is', num if num == 5566: print "I love 5566" 你應該可以看到輸出的結果變成了 :: The number is 7788 感覺到了嗎?這就是條件判斷式的作用,我們用下面的圖來解釋 .. image:: _static/if_diagram.png 條件判斷式就像是你開車在路上遇到了岔路,岔路上面的指示牌就像是判斷式裡的條件,上面可能會寫著 :: 大客車走左邊,小客車走右邊 或是 :: 年齡大於等於18歲走左邊,否則走右邊 而在我們的範例裡面寫的是 :: num == 5566 也是類似的概念,它的意思是說,num這個變數是否和右邊的 5566是相等的,兩個等號就是表示進行相等的比較,值得注意的是這和我們先前看到的單一個等號是不一樣的意思,初學者很容易會將指派的等號,和比較的等號搞混,例如寫出像是 .. code-block:: python if num = 5566: print "I love 5566" 這樣錯誤的寫法 if 判斷式語法 ------------- 在有了最基本的概念之後,我們來介紹最簡單的條件判斷式語法 .. code-block:: python if 條件: 成立時執行的程式片段 如下面圖所示 .. image:: _static/if_diagram_2.png 很簡單的概念就是在條件的欄位寫上你想判斷的條件,在執行時,如果條件成立的話,它就會執行 "成立時執行的程式片段",如果不則立,在片段裡的程式則會被略過繼續往下執行 程式區塊縮排 ------------ 我們在上面所看到的 "成立時執行的程式片段",嚴格來說叫做程式區塊,事實上你可以在裡面寫任意的程式,值得注意的是,Python的程式區塊是以同樣空白數量的縮排來決定的,這點有別於大部份程式語言,這麼做是為了讓程式好讀,我們來看一個多行的程式區塊例子 .. code-block:: python num = 5566 if num == 5566: print 'I love 5566' print '5566 is the best' print '5566 awesome' 你可以發現我們打了三行的程式在if的程式區塊裡面,它們每行開頭前面都有四個空白來將程式區塊裡的程式推齊,如此一來就有一種階梯式的視覺效果,有哪幾行程式屬於同一個程式區塊就可以一目瞭然 常見的新手錯誤就是忘記縮排,像是上面的程式範例新手可能寫錯成這樣 .. code-block:: python num = 5566 if num == 5566: print 'I love 5566' print '5566 is the best' print '5566 awesome' 這樣會產生語法錯誤,或著說寫錯成這樣 .. code-block:: python num = 5566 if num == 5566: print 'I love 5566' print '5566 is the best' print '5566 awesome' 這樣一來,只有第一行 .. code-block:: python print 'I love 5566' 被認為是if的程式區塊,除非你有意這樣做,不然你想讓倒數兩行也都納入if的程式區塊的話,記得所有的行前面都得加上一樣長度的空白,一般建議是以4個為基準 判斷條件 -------- 我們在前面所介紹的判斷條件,我們認識了相等的判斷,但實際上還有很多其它的判斷條件式,像是大於、小於、大於等於、小於等於以及不等於,我們就在以下介紹它們的寫法 +---------+-------+ |比較運算 |語法 | +=========+=======+ |相等 |a == b | +---------+-------+ |不等於 |a != b | +---------+-------+ |大於 |a > b | +---------+-------+ |小於 |a < b | +---------+-------+ |大於等於 |a >= b | +---------+-------+ |小於等於 |a <= b | +---------+-------+ 值得注意的是,有些新手在寫大於等於時或小於等於時容易把大於小於和等號弄顛倒,像是 :: => =< 上面這種寫法是錯的,請記得等號永遠都是放在後面 在認識了比較運算式之後,我們來看一些簡單的範例 .. code-block:: python age = 20 if age >= 18: print 'drink wine' if age < 18: print 'drink water' 這個例子執行的結果會是 :: drink wine 因為age的值是20,在遇到第一個判斷式時,因為 age >= 18 是成立的,因此裡面的程式區塊會被執行,而執行到第四行時,因為age < 18不成立,所以 drink water 並不會被印出來 if-else 判斷式 -------------- 你是否發現了,我們在上一節的範例裡,寫得有點囉唆,因為對於任何實數而言,只有大於等於18,或是小於18兩種可能,簡而言之,只有成立和不成立的情況,一般的if都是對於成立進行處理,那麼對不成立的情況又該怎麼辦呢? 答案很簡單,我們可以用 if-else 判斷式,我們把之前的例子改成 if-else 判斷式 .. code-block:: python age = 17 if age >= 18: print 'drink wine' else: print 'drink water' 你會發現我們把第二行 if 換成了 else,而 else 的意思是 "其它" ,也就是說,當第一行的 if 不成立時,程式的執行就會跳到 else: 裡面的程式區塊去執行,在上例我們也把 age 改成了 17,因為 age >= 18 是不成立的,所以會跳到 else: 下面執行,輸出的結果就會是 :: drink water if-else 判斷式語法 ------------------ if-else 判斷式的語法本質上和 if 判斷式很相近,只是下面加了 else: .. code-block:: python if 條件: 成立時執行的程式片段 else: 不成立時執行的程式片段 其流程如下圖所示 .. image:: _static/if_diagram_3.png 邏輯運算式 ---------- 很多時候,我們在描述一個條件,並不會只有單一個情況,很多時候會有多個不同條件,舉個例子,如果一個學校要招生,可能會開出類似像這樣的條件 :: 國文成積高於 50 分 且 數學成積高於 50 分 像這種例子,指的是國文和數學都得高於50分,因為為中間用的是 "且" 字,而如果他是這樣寫 :: 國文成積高於 50 分 或 數學成積高於 50 分 那就表示國文和數學,只要有一個超過50分即可,因為中間用的是 "或" 字 像這類的不同條件間的邏輯組合除了在日常生活中很常見,同樣的在程式語言裡也很常件,我們舉個例子 .. code-block:: python math = 50 chinese = 50 if math > 50 and chinese > 50: print "You are qualified" 在上述python程式中,我們在條件裡寫了兩種,中間用 "and" 隔開,其概念就和中文的 "且" 字一樣,如此一來,當math大於50,且chinese大於50時,才會印出 :: You are qualified 接著讓我們介紹不同的邏輯運算子 +---------+------------+ |邏輯 |語法 | +=========+============+ |且 |a and b | +---------+------------+ |或 |a or b | +---------+------------+ |否定 |not a | +---------+------------+ 我們在此用成績判斷邏輯和相對應的Python語法來讓讀者瞭解其概念及用法 :: 國文成績不低於60分 Python寫法:: not chinese < 60 如上例所示,原本chinese < 60是指國文成績是否小於60,前面加一個 not 就是否定的意思,所以就變成了國文成績不低於60 :: 數學成績大於60,或國文成績大於80且英文成績大於80 Python寫法:: math > 60 or (chinse > 80 and english > 80) 在此例中,數學成績大於60,或是國文成績和英文成績同時大於80即是成立,我們用括號把後面的條件先括起來,表示他們會優先運算,這和先乘除後加減的概念是一樣的,雖然 and 運算會先進行,然而為了能清楚讓人讀懂,最好還是用括號將欲優先運算之邏輯括起來