# 判斷(if)語句
## 目標
* 開發中的應用場景
* if 語句體驗
* if 語句進階
* 綜合應用
## 01. 開發中的應用場景
生活中的判斷幾乎是無所不在的,我們每天都在做各種各樣的選擇,如果這樣?如果那樣?……


### 程序中的判斷

```python
if 今天發工資:
先還信用卡的錢
if 有剩余:
又可以happy了,O(∩_∩)O哈哈~
else:
噢,no。。。還的等30天
else:
盼著發工資
```
### 判斷的定義
* 如果 **條件滿足**,才能做某件事情,
* 如果 **條件不滿足**,就做另外一件事情,或者什么也不做
> 正是因為有了判斷,才使得程序世界豐富多彩,充滿變化!
>
> **判斷語句** 又被稱為 “分支語句”,正是因為有了判斷,才讓程序有了很多的分支
## 02. if 語句體驗
### 2.1 if 判斷語句基本語法
在 `Python` 中,**if 語句** 就是用來進行判斷的,格式如下:
```python
if 要判斷的條件:
條件成立時,要做的事情
……
```
> 注意:代碼的縮進為一個 `tab` 鍵,或者 **4** 個空格 —— **建議使用空格**
>
> * 在 Python 開發中,Tab 和空格不要混用!
**我們可以把整個 if 語句看成一個完整的代碼塊**

### 2.2 判斷語句演練 —— 判斷年齡
**需求**
1. 定義一個整數變量記錄年齡
2. 判斷是否滿 18 歲 (**>=**)
3. 如果滿 18 歲,允許進網吧嗨皮
```python
# 1. 定義年齡變量
age = 18
# 2. 判斷是否滿 18 歲
# if 語句以及縮進部分的代碼是一個完整的代碼塊
if age >= 18:
print("可以進網吧嗨皮……")
# 3. 思考!- 無論條件是否滿足都會執行
print("這句代碼什么時候執行?")
```
**注意**:
* `if` 語句以及縮進部分是一個 **完整的代碼塊**
### 2.3 else 處理條件不滿足的情況
**思考**
在使用 `if` 判斷時,只能做到滿足條件時要做的事情。那如果需要在 **不滿足條件的時候**,做某些事情,該如何做呢?
**答案**
`else`,格式如下:
```python
if 要判斷的條件:
條件成立時,要做的事情
……
else:
條件不成立時,要做的事情
……
```
**注意**:
* `if` 和 `else` 語句以及各自的縮進部分共同是一個 **完整的代碼塊**
### 2.4 判斷語句演練 —— 判斷年齡改進
**需求**
1. 輸入用戶年齡
2. 判斷是否滿 18 歲 (**>=**)
3. 如果滿 18 歲,允許進網吧嗨皮
4. 如果未滿 18 歲,提示回家寫作業
```python
# 1. 輸入用戶年齡
age = int(input("今年多大了?"))
# 2. 判斷是否滿 18 歲
# if 語句以及縮進部分的代碼是一個完整的語法塊
if age >= 18:
print("可以進網吧嗨皮……")
else:
print("你還沒長大,應該回家寫作業!")
# 3. 思考!- 無論條件是否滿足都會執行
print("這句代碼什么時候執行?")
```

## 03. 邏輯運算
* 在程序開發中,通常 **在判斷條件時**,會需要同時判斷多個條件
* 只有多個條件都滿足,才能夠執行后續代碼,這個時候需要使用到 **邏輯運算符**
* **邏輯運算符** 可以把 **多個條件** 按照 **邏輯** 進行 **連接**,變成 **更復雜的條件**
* Python 中的 **邏輯運算符** 包括:**與 and**/**或 or**/**非 not** 三種
### 3.1 `and`
```
條件1 and 條件2
```
* **與**/**并且**
* 兩個條件同時滿足,返回 `True`
* 只要有一個不滿足,就返回 `False`
| 條件 1 | 條件 2 | 結果 |
| :---: | :---: | :---: |
| 成立 | 成立 | 成立 |
| 成立 | 不成立 | 不成立 |
| 不成立 | 成立 | 不成立 |
| 不成立 | 不成立 | 不成立 |
### 3.2 `or`
```
條件1 or 條件2
```
* **或**/**或者**
* 兩個條件只要有一個滿足,返回 `True`
* 兩個條件都不滿足,返回 `False`
| 條件 1 | 條件 2 | 結果 |
| :---: | :---: | :---: |
| 成立 | 成立 | 成立 |
| 成立 | 不成立 | 成立 |
| 不成立 | 成立 | 成立 |
| 不成立 | 不成立 | 不成立 |
### 3.3 `not`
```
not 條件
```
* **非**/**不是**
| 條件 | 結果 |
| :---: | :---: |
| 成立 | 不成立 |
| 不成立 | 成立 |
#### 邏輯運算演練
1. 練習1: 定義一個整數變量 `age`,編寫代碼判斷年齡是否正確
* 要求人的年齡在 0-120 之間
2. 練習2: 定義兩個整數變量 `python_score`、`c_score`,編寫代碼判斷成績
* 要求只要有一門成績 > 60 分就算合格
3. 練習3: 定義一個布爾型變量 `is_employee`,編寫代碼判斷是否是本公司員工
* 如果不是提示不允許入內
答案 1:
```python
# 練習1: 定義一個整數變量 age,編寫代碼判斷年齡是否正確
age = 100
# 要求人的年齡在 0-120 之間
if age >= 0 and age <= 120:
print("年齡正確")
else:
print("年齡不正確")
```
答案 2:
```python
# 練習2: 定義兩個整數變量 python_score、c_score,編寫代碼判斷成績
python_score = 50
c_score = 50
# 要求只要有一門成績 > 60 分就算合格
if python_score > 60 or c_score > 60:
print("考試通過")
else:
print("再接再厲!")
```
答案 3:
```python
# 練習3: 定義一個布爾型變量 `is_employee`,編寫代碼判斷是否是本公司員工
is_employee = True
# 如果不是提示不允許入內
if not is_employee:
print("非公勿內")
```
## 04. if 語句進階
### 4.1 `elif`
* 在開發中,使用 `if` 可以 **判斷條件**
* 使用 `else` 可以處理 **條件不成立** 的情況
* 但是,如果希望 **再增加一些條件**,**條件不同,需要執行的代碼也不同** 時,就可以使用 `elif`
* 語法格式如下:
```python
if 條件1:
條件1滿足執行的代碼
……
elif 條件2:
條件2滿足時,執行的代碼
……
elif 條件3:
條件3滿足時,執行的代碼
……
else:
以上條件都不滿足時,執行的代碼
……
```
* 對比邏輯運算符的代碼
```python
if 條件1 and 條件2:
條件1滿足 并且 條件2滿足 執行的代碼
……
```
**注意**
1. `elif` 和 `else` 都必須和 `if` 聯合使用,而不能單獨使用
2. 可以將 `if`、`elif` 和 `else` 以及各自縮進的代碼,看成一個 **完整的代碼塊**
#### elif 演練 —— 女友的節日
**需求**
1. 定義 `holiday_name` 字符串變量記錄節日名稱
2. 如果是 **情人節** 應該 **買玫瑰**/**看電影**
3. 如果是 **平安夜** 應該 **買蘋果**/**吃大餐**
4. 如果是 **生日** 應該 **買蛋糕**
5. 其他的日子每天都是節日啊……
```
holiday_name = "平安夜"
if holiday_name == "情人節":
print("買玫瑰")
print("看電影")
elif holiday_name == "平安夜":
print("買蘋果")
print("吃大餐")
elif holiday_name == "生日":
print("買蛋糕")
else:
print("每天都是節日啊……")
```
### 4.2 `if` 的嵌套

> **elif** 的應用場景是:**同時** 判斷 **多個條件**,所有的條件是 **平級** 的
* 在開發中,使用 `if` 進行條件判斷,如果希望 **在條件成立的執行語句中** 再 **增加條件判斷**,就可以使用 **if 的嵌套**
* **if 的嵌套** 的應用場景就是:**在之前條件滿足的前提下,再增加額外的判斷**
* **if 的嵌套** 的語法格式,**除了縮進之外** 和之前的沒有區別
* 語法格式如下:
```python
if 條件 1:
條件 1 滿足執行的代碼
……
if 條件 1 基礎上的條件 2:
條件 2 滿足時,執行的代碼
……
# 條件 2 不滿足的處理
else:
條件 2 不滿足時,執行的代碼
# 條件 1 不滿足的處理
else:
條件1 不滿足時,執行的代碼
……
```
#### if 的嵌套 演練 —— 火車站安檢
**需求**
1. 定義布爾型變量 `has_ticket` 表示是否有車票
2. 定義整型變量 `knife_length` 表示刀的長度,單位:厘米
3. 首先檢查是否有車票,如果有,才允許進行 **安檢**
4. 安檢時,需要檢查刀的長度,判斷是否超過 20 厘米
* 如果超過 20 厘米,提示刀的長度,不允許上車
* 如果不超過 20 厘米,安檢通過
5. 如果沒有車票,不允許進門
```python
# 定義布爾型變量 has_ticket 表示是否有車票
has_ticket = True
# 定義整數型變量 knife_length 表示刀的長度,單位:厘米
knife_length = 20
# 首先檢查是否有車票,如果有,才允許進行 安檢
if has_ticket:
print("有車票,可以開始安檢...")
# 安檢時,需要檢查刀的長度,判斷是否超過 20 厘米
# 如果超過 20 厘米,提示刀的長度,不允許上車
if knife_length >= 20:
print("不允許攜帶 %d 厘米長的刀上車" % knife_length)
# 如果不超過 20 厘米,安檢通過
else:
print("安檢通過,祝您旅途愉快……")
# 如果沒有車票,不允許進門
else:
print("大哥,您要先買票啊")
```
## 05. 綜合應用 —— 石頭剪刀布
**目標**
1. 強化 **多個條件** 的 **邏輯運算**
2. 體會 `import` 導入模塊(“工具包”)的使用
**需求**
1. 從控制臺輸入要出的拳 —— 石頭(1)/剪刀(2)/布(3)
2. 電腦 **隨機** 出拳 —— 先假定電腦只會出石頭,完成整體代碼功能
3. 比較勝負
| 序號 | 規則 |
| :---: | :---: |
| 1 | 石頭 勝 剪刀 |
| 2 | 剪刀 勝 布 |
| 3 | 布 勝 石頭 |
### 5.1 基礎代碼實現
* 先 **假定電腦就只會出石頭**,完成整體代碼功能
```python
# 從控制臺輸入要出的拳 —— 石頭(1)/剪刀(2)/布(3)
player = int(input("請出拳 石頭(1)/剪刀(2)/布(3):"))
# 電腦 隨機 出拳 - 假定電腦永遠出石頭
computer = 1
# 比較勝負
# 如果條件判斷的內容太長,可以在最外側的條件增加一對大括號
# 再在每一個條件之間,使用回車,PyCharm 可以自動增加 8 個空格
if ((player == 1 and computer == 2) or
(player == 2 and computer == 3) or
(player == 3 and computer == 1)):
print("噢耶!!!電腦弱爆了!!!")
elif player == computer:
print("心有靈犀,再來一盤!")
else:
print("不行,我要和你決戰到天亮!")
```
### 5.2 隨機數的處理
* 在 `Python` 中,要使用隨機數,首先需要導入 **隨機數** 的 **模塊** —— “工具包”
```python
import random
```
* 導入模塊后,可以直接在 **模塊名稱** 后面敲一個 `.` 然后按 `Tab` 鍵,會提示該模塊中包含的所有函數
* `random.randint(a, b)` ,返回 `[a, b]` 之間的整數,包含 `a` 和 `b`
* 例如:
```python
random.randint(12, 20) # 生成的隨機數n: 12 <= n <= 20
random.randint(20, 20) # 結果永遠是 20
random.randint(20, 10) # 該語句是錯誤的,下限必須小于上限
```
- linux基礎
- 01_Python基礎課程安排
- 02_操作系統(科普章節)
- 03_操作系統的發展史(科普章節)
- 04_文件和目錄(理解)
- 05_Ubuntu圖形界面入門
- 06_常用Linux命令的基本使用
- 07_Linux終端命令格式
- 08_文件和目錄常用命令
- 09_遠程管理常用命令
- 10_用戶權限相關命令
- 11_系統信息相關命令
- 12_其他命令
- python基礎
- 01_認識 Python
- 02_第一個Python 程序
- 03_PyCharm的初始設置(知道)
- 04_多文件項目的演練
- 05_注釋
- 06_算數運算符
- 07_程序執行原理(科普)
- 08_變量的基本使用
- 09_變量的命名
- 10_判斷(if)語句
- 11_運算符
- 12_循環
- 13_函數基礎
- 14_高級變量類型
- 15_綜合應用——名片管理系統
- 16_變量進階(理解)
- 17_函數進階.md
- 面向對象
- 01_面向對象(OOP)基本概念
- 02_類和對象
- 03_面向對象基礎語法
- 04_面向對象封裝案例
- 05_面向對象封裝案例 II