02 - 判斷式

  • if/elif/else
  • 運算優先順序
  • 更多判斷式使用情境

if/elif/else

if 布林型別:
    如果布林型別==True,就做這裡面的事情

if是判斷式必備的:

  • if:一種選項,滿足條件,才執行某動作
  • elif:有更多條件,滿足的話執行某動作,須伴隨if存在
  • else:當以上條件都不滿足,執行某動作,須伴隨if存在
In [1]:
# 基本的判斷式是由 if 構成
a = 61
if a>=60:
    print ("及格")
及格
In [2]:
# 不符合條件,因此什麼都沒有印出
a = 58
if a>=60:
    print ("及格")
In [3]:
# 如果希望處理判斷條件之外的狀況,可以用else
a = 58
if a>=60:
    print ("及格")
else:
    print ("不及格")
不及格

Python是靠「縮排」(四個空格),來斷定程式碼屬於那一個區塊。
if/else 後面記得要有冒號:

In [4]:
a = 11
b = 8
if a>b:
    print("a={}|b={}".format(a,b))
    print("a>b")
elif a<b:
    print("a={},b={}".format(a,b))
    print("a<b")
else:
    print("a={}、b={}".format(a,b))
    print("a==b")
print ("這是判斷式外的區塊")
a=11|b=8
a>b
這是判斷式外的區塊

如果有很多個條件,一個 if 不夠用,可以用 elif

!注意

  • Python是靠「縮排」(四個空格),來斷定程式碼屬於那一個區塊
  • if/elif/else 後面記得都要有冒號:
In [5]:
a = 11
b = 8
# 第1組判斷式
if a%2==0:
    print("a is even")
# 第2組判斷式
if a>b:
    print("a>b")
elif a<b:
    print("a<b")
else:
    print("a==b")
a>b
  • 一個 if 就是一組判斷式
  • 兩組判斷式是不互相影響的
    • 如果 a = 11, b = 8
      第1組判斷式沒有符合任何條件就什麼事都不會做,
      第2組判斷式會印出「a>b」,不受到第1組判斷式任何結果的影響
    • 如果 a = 6, b = 8
      第1組判斷式會印出 「a is even」,
      第2組判斷式會印出 「a<b

想想看

以下狀況是要用幾組判斷式呢?

  • 聊天機器人、Siri...
  • 商店打折可以共用優惠的...
In [6]:
keyword = "我想吃飯"

if keyword=="我想吃飯":
    print("建議你可以吃??")
    
elif keyword=="天氣如何":
    print("今天的天氣...")
    
elif keyword=="7-11":
    print("最近的7-11在oo")
    
else:
    print("我聽不懂你在說什麼")
建議你可以吃??

如果有很多個條件,一個if不夠用,可以用elif,
一個elif不夠用,可以繼續用很多個elif

應該沒有看過Siri回答你今天天氣之後,又說我聽不懂你在說什麼吧?

In [7]:
cost = 1000
gift = ""
# 第1組判斷式
if cost>=500:   # 滿500,送購物袋
    gift = gift+"購物袋"
# 第2組判斷式
if cost>=1000:  # 滿1000折100
    cost = cost-100
print(cost)
print(gift)
900
購物袋

[練習]

請寫一個會打招呼的門禁系統:
如果現在的時間 "2205"

  • 超過晚上10點,會說兩句話「現在很晚了」、「怎麼還在外面遊蕩」
  • 先不要理會凌晨時間

Hint:

  • 記得把字串轉成數字才能比較
time = "2205"
if _____(time) > _____("2200"):
    _____
    _____

進階挑戰

如果現在還要加進判斷凌晨5點之前也說同樣的話呢?

  • 可以用 if / elif
  • 可以用 or

運算優先順序

越上面越優先

[a,b,c] 字串轉換、串列、tuple、字典、集合
x[index], x[i1:i2], x(parameter), x.attr 索引、切片、函式呼叫、存取屬性項
** 次方
+x, -x, ~x 正數、負數、位元NOT運算
*, /, //, % 乘法、除法、餘數、字串格式化
+, - 加法、減法
>>, << 位元位移運算
& 位元AND運算
^ 位元XOR運算
| 位元OR運算
in, is, <, ==, > 比較運算
not x 布林NOT邏輯運算
and 布林AND邏輯運算
or 布林OR邏輯運算
if/else 條件運算式
lambda lambda運算式
In [8]:
print(3+5*4-8/2)
19.0
In [9]:
a=5
b=5
c=2
# (c==3) or (a==b and (not a==3)) or (b==4)
if c==3 or a==b and not a==3 or b==4: 
    print ("1")
else:
    print ("2")
1

!建議

可以用()來方便閱讀,也能確保自己的想法是正確的

  • (c==3) or (a==b and (not a==3)) or (b==4)
  • ((c==3) or (a==b)) and ((not a==3) or (b==4))

[練習] - 判斷是否為閏年

  • 西元年份可被400整除
  • 西元年份可被4整除,但不能被100整除
  • 西元2000年、2060年都是閏年,但1900、2057不是

Hint:

  • 版本1
    year = 2060
    if "西元年份可被400整除":
      print("{}是閏年".format(year))
    elif "西元年份可被4整除" or/and/not? "不能被100整除":
      print("{}是閏年".format(year))
    
  • 版本2
    year = 2060
    if ("西元年份可被400整除") or/and/not? ("西元年份可被4整除" or/and/not? "不能被100整除"):
      print("{}是閏年".format(year))
    

更多判斷式使用情境

[進階練習] - 棄保效應

台灣的選舉法令禁止各陣營及媒體在投票日前的一個星期內公佈民調結果,其中最重要的一個因素是要避免「棄保效應」。
所謂的「棄保效應」是指選民在得知自己所支持的候選人當選無望時,有可能會把票投給其他比較可能當選的人,以免浪費了自己的一票。
假設某選舉有三位候選人來競選一個職位,在「棄保效應」發揮到極致的情形下,所有民調第三名的候選人的支持者都會把票投民調第二名的候選人,也就是他們都會「棄三保二」。給你 A, B, C 三個候選人的支持者人數,請判斷誰會當選?(不考慮支持數一樣)

我們先試試,A,B 候選人的支持數都比 C 候選人低 (a+b<c) 的情況:

  • a=3, b=4, c=5 => b
  • a=1, b=3, c=5 => c

Hint:

  • 如果 (第二三名支持總票數) < 第一名 => 第一名
  • 如果 (第二三名支持總票數) > 第一名
    • 判斷誰是第二名
  • 如果 a+b < c => c 當選
  • 如果 a+b > c
    • a > b => a 當選
    • a < b => b 當選
a=3
b=4
c=5

if ____:
    if ____:
        print("a")
    else:
        print("b")
else:
    print("c")

範圍轉換

遊戲中的角色能力值想從 0~255 轉換到 0~100:

  • 能力良好:200-255 vs. 85-100
  • 能力差勁:0-130 vs. 0-60

在做資料視覺化也有可能會把0~n的數值轉換成色碼表示!

In [10]:
origin = 127
new = 0
if origin<=130:
    new = ((origin-0)*(60-0)/(130-0))+0
elif origin>=200:
    new = ((origin-200)*(100-85)/(255-200))+85
else:
    new = ((origin-130)*(85-60)/(200-130))+60
print(int(new))
58

還有好多例子

  • 電梯只停某些樓層、上下層都有人往上還往下?
  • Alphago 下棋
  • 飲料販賣機
  • 球場上的鷹眼
  • ...

會發覺程式中幾乎都有「判斷式」的身影!!!

其實我們生活中每天也都在用到判斷式:要不要再賴床一下、等下晚餐要吃什麼...