# 3. 邏輯條件判斷

## I. Boolean(布林值)

布林值其實就是電腦科學中的邏輯判斷資料型態，其型態共有兩種`True` 與 `False` ，分別代表**正確**與**錯誤**

* Python的布林值中，數字`0`、**空(empty)** 或 錯誤 代表 `False` ，  **其餘元素** 皆代表`True`
* Python中，boolean縮寫為：`bool`

> 注意! 字串`bool("0")` 為 `True`，與數字`bool(0)`結果不同

```python
trash_talk = "在非洲，每六十秒，就有一分鐘過去"
my_age = 18

print(bool(trash_talk)) # True
print(bool(my_age)) # True
print(bool(1)) # True
```

```python
print(bool(False)) # False
print(bool(None)) # False
print(bool(0)) # False
```

## II. 比較運算

資訊科學中通常有6種比較關係：

|  小於 |  大於 | 小於等於 | 大於等於 |  等於 | 不等於 |
| :-: | :-: | :--: | :--: | :-: | :-: |
|  <  |  >  |  <=  |  >=  |  == |  != |

**注意!** 比較後的結果型態為boolean

```python
num1 = 12
num2 = 10

print(bool(num1 >= num2)) # True
print(bool(num1 != (num2 + 2))) # False
```

因為比較後的結果一定為boolean值，因此可不必使用 `bool()` 來轉換型態

```python
num1 = 12
num2 = 10

print(num1 >= num2) # True
print(num1 != (num2 + 2)) # False
```

## III. 邏輯運算符號

邏輯運算符號可以將兩個以上的判斷式連接起來

|  且  |  或  |  否  |
| :-: | :-: | :-: |
| and |  or | not |

### A. 且

|       | True | False |
| :---: | :--: | :---: |
|  True |   T  |   F   |
| False |   F  |   F   |

### B. 或

|       | True | False |
| :---: | :--: | :---: |
|  True |   T  |   T   |
| False |   T  |   F   |

```python
# 嘗試執行下方程式碼
n = 30
print(n > 50 and n < 100)

# 邏輯運算符號能夠串接多個
print(n < 0 or n > 50 or n == 30)
```

## IV. `if` `else` 條件判斷

### A. `if` 如果

`if`判斷式後面所接的條件判斷會被自動轉為布林值，如果判斷的結果為`True`，才得以執行`if`內的程式碼

```python
your_age = 77

if your_age >= 70:
    print("人生七十古來稀!") # 條件成立才能執行這行程式
```

**注意!** Python 程式碼的 **縮排** 相當重要，縮排的那幾行程式碼都屬於`if`**區塊**裡的程式碼。若判斷結果為`False`，則不執行區塊裡頭的程式碼；反之，若判斷結果為`True`，則執行之

**注意!** 程式中的縮排請按`Tab`鍵

```python
# 嘗試執行下方的程式碼並觀察結果
if 1:
    print("第一個結果!")
if 0:
    print("第二個結果!")
```

```python
# 嘗試執行下方的程式碼並觀察結果
if False:
    print("第一個結果!")
if True:
    print("第二個結果!")
```

```python
# 嘗試執行下方的程式碼並觀察結果
if 1 != 1:
    print("第一個結果!")
if 2 >= -1:
    print("第二個結果!")
```

```python
# 嘗試執行下方的程式碼並觀察結果
if 1 != 1 and 1:
    print("第一個結果!")
if 2 >= -1 or []:
    print("第二個結果!")
```

### B. `else` 否則

`else` 區塊執行的時機就是其所對應的`if`判斷條件為`False`時，所以它一定接在某個`if`後面

```python
# 嘗試執行下方的程式碼並觀察結果
if 2 > 3:
    print('百年難得一見的數學天才')

else:
    print("這樣才對嘛~")
```

請記得`if`的區塊和`else`的區塊之間絕不能放任何程式(除了無意義的空行或空白以外)

```python
# 嘗試執行下方的程式碼並觀察結果
if 2 > 3:
    print('百年難得一見的數學奇才')

print('來調皮一下')

else: # SyntaxError: invalid syntax
    print("這樣才對嘛~")
```

高手的寫法

```python
print("超過100分") if 2 > 3 else print("錯誤")
```

#### `else` 只會與最接近自己的該個 `if` 配對

```python
# 嘗試執行下方的程式碼並觀察結果
if 1 > 0:
    print('king of the math')
if 2 > 3:
    print('百年難得一見的數學奇才')
else:
    print("這樣才對嘛~")
```

### C. Python常見的錯誤縮排【重要】

> Python對程式碼的格式要求相當高，無故縮排或縮排數量不當都會影響結果的正確性

```python
# IndentationError: expected an indented block
if 2 > 3:
print('百年難得一見的數學奇才') # if內容未縮排
```

```python
# SyntaxError: invalid character in identifier
 if 2 > 3: # 任何程式碼前無故空格
    print('百年難得一見的數學奇才')
```

```python
# SyntaxError: invalid character in identifier
if 2 > 3:
 print('百年難得一見的數學奇才') # 縮排使用空白鍵而非Tab鍵
```

### D. 邏輯及運算符號優先順序【補充】

> 以下順序由高至低

|                                                                                             符號                                                                                             |    內容    |
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------: |
|                                                                                            `**`                                                                                            |    指數    |
|                                                                                            `~<`                                                                                            |    補數    |
|                                                                                           `+` `-`                                                                                          |   正數、負數  |
|                                                                                      `*` `/` `//` `%`                                                                                      |  乘、除、商、餘 |
|                                                                                           `+` `-`                                                                                          |   加法、減法  |
|                                                                                          `>>` `<<`                                                                                         |   右移、左移  |
|                                                                                             `&`                                                                                            |  和(二進位)  |
|                                                                                             `^`                                                                                            | XOR(二進位) |
|                                                                                            `\|`                                                                                            |  或(二進位)  |
| <p><code>in</code> <code>not in</code> <code>is</code> <code>is not</code> <br><code>></code> <code>&#x3C;</code> <code>>=</code> <code>&#x3C;=</code> <code>!=</code> <code>==</code></p> |   比較運算子  |
|                                                                                            `not`                                                                                           |     否    |
|                                                                                            `and`                                                                                           |     和    |
|                                                                                            `or`                                                                                            |     或    |

## V. 多個相互獨立的條件判斷

> 各條件判斷間沒有關聯性(且**可能同時滿足多個條件**)

利用多個平行的 `if` 來表示各式獨立的情況

【例題】

> 籃球是個相當考驗身高的運動項目，雖然偶爾有些情況可以用某些方式來彌補身高的不足，但大部分情況都還是由身高決定可勝任地的攻擊及防守位置。\
> 假設身高190公分以上可以打後衛；身高200公分以上可以打前鋒；身高210公分以上可以打中鋒
>
> **輸入說明**\
> 輸入身高\
> **輸出說明**\
> 輸出可以勝任的球場位置

```python
height = int(input("請輸入您的身高："))

if height >= 190
    print("可以打後衛")
if height >= 200:
    print("可以打鋒衛")
if height >= 210:
    print("可以打中鋒")
```

## VI. 多層次的條件判斷

> 一個條件判斷完後還有更深一層的判斷

在某條件成立之後，才去判斷下一個條件是否成立，即 `if` 裡面還有 `if`

**注意!** 縮排別忘了唷!

【例題】

> 小智準備去探險了，大木博士準備了兩隻相當有潛力的神奇寶貝(妙蛙種子/傑尼龜)給小智做選擇，但不能說：我全都要。請設計出一款這樣的RPG遊戲對話情境吧!

```python
pokemon = input('請問你要選擇哪隻精靈?(妙蛙種子/傑尼龜)')
if pokemon == '妙蛙種子':
    if 'Y' == input('請問你想要進化成妙蛙花嗎?(Y/N)'):
        print('種子種子')
    else:
        print('草泥草尼')
else:
    if 'Y' == input('請問你想要進化成水箭龜嗎?(Y/N)'):
        print('傑尼杰尼')
    else:
        print('哭啊不給進化')
```

## VII. 多個條件判斷，只符合其中一種

【例題1】

> &#x20;目前有許多對於不同的血型的都市傳說，嘗試做個血型都市傳說器\
> &#x20;**輸入說明**\
> &#x20;輸入血型\
> &#x20;**輸出說明**\
> &#x20;輸出都市傳說

```python
blood_type = input('請輸入您的血型：')
if blood_type == 'O' or blood_type == 'o':
    print('據說這種血型的人都很幽默')
if blood_type == 'A' or blood_type == 'a':
    print('據說這種血型的人都很聰明')
if blood_type == 'B' or blood_type == 'b':
    print('據說這種血型的人都很勤勞')
if blood_type == 'AB' or blood_type == 'ab':
    print('據說這種血型的人都很有錢')
if blood_type == 'RH' or blood_type == 'Rh' or blood_type == 'rh':
    print('據說這種血型的人都很穩重')
```

上面範例利用許多`if`達成題目的要求，但每個`if`都要做判斷會拖慢程式執行速度。既然所有情況都是互斥的，也就是不可能同時發生兩種狀況(例如：同時是O型又是A型)，因此

其實我們可以有更好的寫法提升程式執行的效率：`elif`

`elif` 只要前面任一列程式條件成立，後面的就不會再判斷了，能省下許多時間(下方為修改後的程式碼)

```python
blood_type = input('請輸入您的血型：')
if blood_type == 'O' or blood_type == 'o':
    print('據說這種血型的人都很幽默')
elif blood_type == 'A' or blood_type == 'a':
    print('據說這種血型的人都很聰明')
elif blood_type == 'B' or blood_type == 'b':
    print('據說這種血型的人都很勤勞')
elif blood_type == 'AB' or blood_type == 'ab':
    print('據說這種血型的人都很有錢')
elif blood_type == 'RH' or blood_type == 'Rh' or blood_type == 'rh':
    print('據說這種血型的人都很穩重')
```

【例題2】

> &#x20;每學期期末都是大學生神經最緊繃的時段\
> &#x20;因為這段時間會決定自己所修的科目是否有及格\
> &#x20;否則明年就準備當學弟了\
> &#x20;**輸入說明**\
> &#x20;輸入期末考的分數\
> &#x20;**輸出說明**\
> &#x20;輸出分數的等級

```python
num = int(input('請輸入您的分數：'))
if num >= 90:
    print("A")
elif num < 90 and num >= 80:
    print("B")
elif num < 80 and num >= 70:
    print("C")
elif num < 70 and num >= 60:
    print("D")
else:
    print("考試不努力明年當學弟")
```

**注意!** 很多其他程式語言無法接受`40 <= num <60`的寫法，必須拆開成`40 <= num and num <60`這種寫法

## VIII. 學習單

{% embed url="https://docs.google.com/presentation/d/e/2PACX-1vQ6UTkn8rRCglBwRGkHIUOBvbDgHiOEqNzMk1c4Lc93skXBWINCXh5B3hLaIV5lzB9KeZrsia7j5d4S/embed?start=false&loop=false&delayms=3000" %}

