分支结构
# 分支结构
## 概述
程序的默认执行顺序是**顺序结构**——从上到下逐条执行。但很多场景下需要根据不同条件选择不同的执行路径,这就是**分支结构**(也叫选择结构)。
典型的例子:游戏过关时根据分数决定进入下一关还是 Game Over。
## if / elif / else 分支结构
Python 用 `if`、`elif`、`else` 三个关键字构造分支结构。
### 基本 if 结构
```python
height = float(input('身高(cm): '))
weight = float(input('体重(kg): '))
bmi = weight / (height / 100) ** 2
print(f'{bmi = :.1f}')
if 18.5 <= bmi < 24:
print('你的身材很棒!')
```
> **注意**:`if` 条件后要有英文冒号 `:`,代码块用**缩进**(通常4个空格)表示,不要用 Tab。
### if-else 结构
```python
height = float(input('身高(cm): '))
weight = float(input('体重(kg): '))
bmi = weight / (height / 100) ** 2
print(f'{bmi = :.1f}')
if 18.5 <= bmi < 24:
print('你的身材很棒!')
else:
print('你的身材不够标准!')
```
### 多分支结构
```python
height = float(input('身高(cm): '))
weight = float(input('体重(kg): '))
bmi = weight / (height / 100) ** 2
print(f'{bmi = :.1f}')
if bmi < 18.5:
print('体重过轻')
elif bmi < 24:
print('身材很棒')
elif bmi < 27:
print('体重过重')
elif bmi < 30:
print('轻度肥胖')
elif bmi < 35:
print('中度肥胖')
else:
print('重度肥胖')
```
> **说明**:Python 支持连续比较 `18.5 <= bmi < 24`,C/Java 等语言需要写成 `bmi >= 18.5 and bmi < 24`。
## match-case 结构(Python 3.10+)
Python 3.10 引入了类似 switch 的 match-case 语法:
```python
status_code = int(input('响应状态码: '))
match status_code:
case 400: description = 'Bad Request'
case 401: description = 'Unauthorized'
case 403: description = 'Forbidden'
case 404: description = 'Not Found'
case 418: description = 'I am a teapot'
case 429: description = 'Too Many Requests'
case _: description = 'Unknown Status' # 通配符
print('状态码描述:', description)
```
### 模式合并
使用 `|` 合并多个匹配值:
```python
match status_code:
case 400 | 405: description = 'Invalid Request'
case 401 | 403 | 404: description = 'Not Allowed'
case _: description = 'Unknown'
```
## 应用实例
### 实例1:分段函数求值
$$
y = \begin{cases} 3x - 5 & (x > 1) \\ x + 2 & (-1 \le x \le 1) \\ 5x + 3 & (x < -1) \end{cases}
$$
```python
x = float(input('x = '))
if x > 1:
y = 3 * x - 5
elif x >= -1:
y = x + 2
else:
y = 5 * x + 3
print(f'{y = }')
```
> **提示**:分支可以嵌套,但应遵循"扁平化优于嵌套"原则。
### 实例2:百分制成绩转等级
```python
score = float(input('请输入成绩: '))
if score >= 90: grade = 'A'
elif score >= 80: grade = 'B'
elif score >= 70: grade = 'C'
elif score >= 60: grade = 'D'
else: grade = 'E'
print(f'{grade = }')
```
### 实例3:计算三角形周长和面积
```python
a = float(input('a = '))
b = float(input('b = '))
c = float(input('c = '))
if a + b > c and a + c > b and b + c > a:
perimeter = a + b + c
s = perimeter / 2
area = (s * (s - a) * (s - b) * (s - c)) ** 0.5 # 海伦公式
print(f'周长: {perimeter}')
print(f'面积: {area}')
else:
print('不能构成三角形')
```
## 总结
- 分支结构使程序具备"选择性执行"的能力
- `if-elif-else` 是最常用的多分支结构
- Python 用缩进表示代码块,保持缩进一致非常重要
- `match-case`(Python 3.10+)是多分支的简洁替代方案