iT邦幫忙

5

【Python 超入門】(6) if-else邏輯: 人生最常做的事,不是吃飯睡覺,而是______

大家好,我是「心原一馬」,內心原來一心喜歡打程式碼。
今天不談深奧的語法,來聊聊程式邏輯,
很多人覺得說自己數理邏輯不是很好,自己適合寫程式嗎?
其實,入門打程式的邏輯,早已充斥於日常生活中,
這便是人生無時無刻在面對的事-「選擇」。

下一刻…我在哪?

人生無時無刻不在選擇,例如午餐要吃什麼?
我下一分鐘要繼續滑手機還是去讀書呢?
下一句話要說什麼才能討朋友歡心呢?
諸如各種選擇的問題,在程式語言中,
我們用if-else告訴電腦在什麼情境下,
我們要做什麼選擇。

比較性的問題

通常電腦會問的問題是比較兩個東西,
例如一個數字有沒有比另一個數字大,
而問題的答案只會有兩個值TrueFalse
例如說我們有2個蘋果和3個香蕉,
我們可以產生變數applebanana來記錄蘋果和香蕉的值。

apple = 2
banana = 3

接著我們可以問: 蘋果有比香蕉多嗎?

我們想用一個變數來記錄這個答案,
【Python 超入門】(4)變數型態-list: 能納百物的百寶袋中,
我們介紹了三種變數型態數字、字串、列表(list)
現在正式介紹第四種- 布林值(boolean),
它只有兩種值TrueFalse
條件判斷式apple > banana 便是在判斷「蘋果有比香蕉多嗎?」,
它的運算結果是一個布林值。

現在,用一個變數ans來記錄這個問題的答案:

ans = apple > banana
print(ans)

結果為False

再詳細說明一下這句「ans = apple > banana」這句話,
我知道如果沒接觸過程式的話,
看到這句話會覺得非常不習慣,
我用數學運算打個比方好了,
例如寫「num = 8*9」是什麼意思呢?
就是先做「8乘以9」的數學運算,得到結果「72」,
再把72這個答案存到名字為 num 的變數中。
同樣的,「ans = apple > banana」這句話,
就是先做「apple > banana」(蘋果有比香蕉多嗎?)的邏輯判斷,
得到結果「False」(蘋果沒有比香蕉多),
再把結果存在名字為 ans 的變數中。

我們也可以問: 蘋果跟香蕉一樣多嗎?
我們用變數ans2 來記錄這個問題的答案:

#這段程式用括號把 apple == banana 括起來,
#讓讀者看的比較清楚是先做 apple == banana 的判斷,
#再把結果存在ans2裡
ans2 = (apple == banana) 
print(ans2)

結果為False
注意在判斷是否一樣多時用的符號是兩個等號「==」,
單等號「=」用來指定變數的值,
雙等號「==」則用來比較兩個數值,是「比較運算子」。

「比較運算子」顧名思義是程式用來進行比較的運算,
列出幾個常見的「比較運算子」:

比較運算子 意義
== 等於
!= 不等於
< 小於
> 大於
<= 小於或等於
>= 大於或等於

if 基本語法

if 的口語為日常生活的「如果…就…」,
當條件運算式的值為True時,執行if語句裡面的敘述,
(注意放在if 條件運算式後面要加「冒號」,放在if裡的敘述必須空四格)

if 條件運算式:
    條件成立時就做這個敘述

if-else

if-else 的口語為日常生活的「如果…就…,否則…」,
當條件運算式的值為True時,執行if語句裡面的敘述,
否則執行else語句裡的敘述。
(注意else後面一樣要加冒號)

if 條件運算式:
    條件成立時就做這個敘述
else:
    否則做這個敘述

if-elif-else

要判斷多重條件時,這個語法就派上用場了,

if 條件運算式1:
    第一個敘述
elif 條件運算式2:
    第二個敘述
elif 條件運算式N:
    第N個敘述
else:
    否則做這個敘述

當條件運算式1不符合時會向下找到滿足的條件為止。

世界上最遙遠的距離

世界上最遙遠的距離不是生與死,
而是if和else經常成對出現,
卻永遠無法結伴同行。
這大概是對if-else最貼切的描述了吧。

範例1- 老師我過了嗎?

有一位老師的評分標準如下:
整學期只有一次期末考,
如果學生考試分數在60分以上就及格了,
否則學生該科目被當。
寫成程式如下:

score = 60  #用score這個變數來儲存學生的考試分數
if score>=60:
    print("恭喜你及格了")
else:
    print("沒有及格,再接再厲")

結果為 恭喜你及格了

範例2- 選擇開冷氣還是開暖氣?

例如我們想要根據現在的溫度來決定要不要開冷氣,
當溫度大於30度時,我們想要開冷氣;
而當溫度小於20度時想要開暖氣。
程式如下:

T= 25  #用T這個變數來儲存現在的溫度
if T>30:
    print("天氣好熱,要開冷氣")
elif T<20:
    print("天氣好冷,要開暖氣")

結果不會印出東西(25度沒有達到開冷氣或開暖氣的條件)

範例3- 評定成績

現在很多大學成績單不是用百分制而是用等第制了,
(為了方便,本例子就不細分等第至 「B-」,「B」,「B+」)
例如90分以上是「A+」,
80~89分是「A」,
70~79分是「B」,
60~69分是「C」,
小於60分為「F」(不及格)。
程式如下:

score = 79  #用score這個變數來儲存學生的學期成績
if score>=90:
    print("等第為A+,太厲害了")
elif score>=80:
    print("等第為A,很優秀哦")
elif score>=70:
    print("等第為B,還不錯哦")
elif score>=60:
    print("等第為C,馬馬虎虎啦")
else:
    print("等第為F,再接再厲")

結果為 等第為B,還不錯哦

and(且), or(或) , not(不是) 邏輯

日常生活中,常會有多個條件式一起比較的例子,
例如一個小孩充滿期待的問媽媽:
「馬麻,這個週末可以去遊樂園玩嗎?」
媽媽可能會這樣回答:
「如果『這週末是晴天』而且『我週末有放假的話』就可以帶你去玩哦」
那python中的「且」、「或」、「不」要怎麼寫呢?
其實它們就對應到英文的「and」、「or」、「not」,夠簡單吧?
多看幾個例子就容易明白的。

範例1: 馬麻,可不可以去遊樂園嘛~

在剛剛的故事中,
我們用 isSunny 這個變數表示是不是晴天,
用 isFree 這個變數表示馬麻週末有沒有放假,
這兩個變數都是布林值。(忘記布林值是什麼的同學,罰你再翻到文章上面複習~)
程式如下:

isSunny = True
isFree = True
if isSunny and isFree:
    print("週末可以去遊樂園玩")

結果為 週末可以去遊樂園玩
註: and運算只有兩個條件都是True時才是True,
or 運算只要任一個條件是True就是True。

範例2: 保護級需有大人陪同

小孩開心的在遊樂園玩了一天之後,
晚上還想去看電影,
可是要看一部保護級可是有一些限制的呢~
電影院的告示牌如下:
https://ithelp.ithome.com.tw/upload/images/20190627/2011711472ijXW1ymg.jpg
我們用 age 變數表示小孩的年齡,
用 hasAdult 變數(布林值)表示是否有大人陪同,
如下:

age = 10
hasAdult = True

想一想,程式邏輯要怎麼寫。這題稍有難度囉~
(可以先想好再翻到下面對答案…)












想好了嗎?答案可能不唯一,如果你有其它好答案也歡迎留言分享。
根據規則,我們可以解讀成只要在12歲以上一定可以看電影,
否則需要6歲以上且有大人陪同才可以看,
因此可以寫成:

age = 10
hasAdult = True
if (age >= 12) or (age >= 6 and hasAdult):
    print("可以看保護級電影")

課後練習 - 夜市的棒球九宮格

又到了課後練習時間啦~
夜市有一種遊戲叫作棒球九宮格,
上面有1~9的數字格子,
一局遊戲有9顆球,
打中愈多格子可以得到的獎品也愈大,
可愛小馬九宮格攤位的規則如下,
如果你打中5個格子以上,可以得到一隻小馬玩偶
如果你打中7個格子以上,可以得到一隻大馬玩偶 (但是就沒有小馬玩偶了)。
下面這隻程式,試著計算玩家贏得的獎品,
可是邏輯有錯,你能幫忙修正嗎?
歡迎在留言區留下你的答案哦~

grid = 5 #這個變數記錄玩家打中幾個格子
if grid >= 5:
    print("贏得一隻小馬玩偶")
elif grid >= 7:
    print("贏得一隻大馬玩偶")

2
跑得快
iT邦新手 3 級 ‧ 2019-06-28 16:34:18

今天剛好grid=5不會出現異常
如果照原邏輯

grid = 7 #這個變數記錄玩家打中幾個格子
if grid >= 5:
    print("贏得一隻小馬玩偶")
elif grid >= 7:
    print("贏得一隻大馬玩偶")

就會輸出兩個結果
贏得一隻小馬玩偶
贏得一隻大馬玩偶

如同上述成績計算一樣
將判斷數字大者放在前面
if grid >= 7:

elif grid >= 5:

else:

print("再接再厲")

以上,有錯誤函請一心原馬大大指教

嗨,跑得快邦友您好:
你理解的很棒哦,修改的方向對了,要先從分數高的開始判斷。只是對於原邏輯的結果有點小錯。當grid=1時,只會輸出一個結果,而非兩個結果哦~
因為 elif 其實是 else if 的意思,
只有當if條件沒有成立的時候,
才會去檢查else if的條件,
所以當判斷出 7>=5 的時候,
會印出贏得一隻小馬玩偶
else if的條件便不會繼續判斷了。
非常感謝您參與回答討論,您的回答同時也能幫大家解惑呢~
如果原程式改成:

grid = 7 #這個變數記錄玩家打中幾個格子
if grid >= 5:
    print("贏得一隻小馬玩偶")
if grid >= 7:
    print("贏得一隻大馬玩偶")

這樣才會印出兩個結果。
(兩個if都會判斷到)

敬祝您 跑得快 也學得更快~

1
心原一馬
iT邦新手 4 級 ‧ 2019-06-28 19:13:00

非常感謝邦友留言參與討論,
現在公佈解答:

if grid >= 7:
    print("贏得一隻大馬玩偶")
elif grid >= 5:
    print("贏得一隻小馬玩偶")
1
小魚
iT邦大師 1 級 ‧ 2019-06-29 17:10:34

if else 就像兩條平行線
就像 金田一高遠遙一 一樣

2
圓頭人
iT邦新手 2 級 ‧ 2019-07-01 14:22:08

有趣的題目^^

哈哈~ 謝謝你欣賞我的題目

0
linlnnnn
iT邦新手 3 級 ‧ 2019-07-05 23:58:26

很棒的入門教學! 讚!

哈哈~ 謝謝你的認同哦~

1
naorosie
iT邦新手 5 級 ‧ 2019-07-18 16:03:17

不好意思,請問以下這段的ans是否應為ans2? 謝謝!
ans2 = (apple == banana)
print(ans)

哇~ 你看的很仔細呢~
因為這一段用了另一個變數ans2來存結果,
應該是print(ans2)才對,
感謝指教,
小馬已在文章中更正,謝謝您~

我要留言

立即登入留言