# Python 条件语句

## 学习目标
- 掌握 `if`、`elif`、`else` 的基本用法
- 理解三元表达式（条件表达式）
- 学会使用 Python 3.10+ 的 `match-case` 结构
- 能够编写多分支逻辑程序

---

## 一、if 语句基础

```python
age = 18

if age >= 18:
    print("你已成年")
```

**注意**：Python 使用缩进（通常是 4 个空格）来表示代码块，而不是大括号。

---

## 二、if-else 语句

```python
age = 16

if age >= 18:
    print("你已成年")
else:
    print("你未成年")
```

---

## 三、if-elif-else 语句

```python
score = 85

if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
elif score >= 60:
    grade = "D"
else:
    grade = "F"

print(f"成绩等级: {grade}")   # 成绩等级: B
```

---

## 四、条件判断的底层

```python
# 条件表达式最终会被转换为布尔值
x = 10

if x:                    # 等价于 if bool(x)，即 if True
    print("x 为真")

# 以下值被视为 False
if not 0:
    print("0 为假")
if not "":
    print("空字符串为假")
if not []:
    print("空列表为假")
if not None:
    print("None 为假")
```

---

## 五、嵌套 if 语句

```python
is_member = True
purchase_amount = 500

if is_member:
    if purchase_amount >= 1000:
        discount = 0.8
    elif purchase_amount >= 500:
        discount = 0.85
    else:
        discount = 0.9
else:
    discount = 1.0

final_price = purchase_amount * discount
print(f"会员: {is_member}, 原价: {purchase_amount}, 实付: {final_price}")
# 会员: True, 原价: 500, 实付: 425.0
```

---

## 六、三元表达式（条件表达式）

```python
# 语法: 值1 if 条件 else 值2
age = 20
status = "成年" if age >= 18 else "未成年"
print(status)   # 成年

# 嵌套三元表达式（可读性较差，不建议过多嵌套）
score = 75
result = "优秀" if score >= 90 else ("良好" if score >= 80 else ("及格" if score >= 60 else "不及格"))
print(result)   # 及格
```

### 与常规 if 的对比

```python
# 常规写法
a = 10
b = 20
if a > b:
    max_val = a
else:
    max_val = b

# 三元表达式
max_val = a if a > b else b
print(max_val)   # 20
```

---

## 七、match-case 语句（Python 3.10+）

`match-case` 是 Python 3.10 引入的模式匹配语法，类似于其他语言中的 `switch-case`，但功能更强大。

### 基本用法

```python
day = 3

match day:
    case 1:
        print("星期一")
    case 2:
        print("星期二")
    case 3:
        print("星期三")
    case 4:
        print("星期四")
    case 5:
        print("星期五")
    case 6 | 7:          # 或匹配
        print("周末")
    case _:              # 默认情况
        print("无效日期")
# 输出: 星期三
```

### 匹配数据结构

```python
# 匹配元组
point = (0, 5)

match point:
    case (0, 0):
        print("原点")
    case (x, 0):
        print(f"x 轴上的点，x={x}")
    case (0, y):
        print(f"y 轴上的点，y={y}")
    case (x, y):
        print(f"点 ({x}, {y})")
# 输出: y 轴上的点，y=5
```

### 匹配字典

```python
user = {"name": "Alice", "age": 25}

match user:
    case {"name": str(name), "age": int(age)}:
        print(f"用户: {name}, 年龄: {age}")
    case {"name": str(name)}:
        print(f"用户: {name}, 年龄未知")
    case _:
        print("未知格式")
# 输出: 用户: Alice, 年龄: 25
```

---

## 八、逻辑组合条件

```python
age = 25
income = 8000

# and：多个条件同时满足
if age >= 18 and income >= 5000:
    print("符合申请条件")

# or：任一条件满足
weekend = True
holiday = False
if weekend or holiday:
    print("今天休息")

# not：取反
is_raining = False
if not is_raining:
    print("可以出门")

# 组合使用
if (age >= 18 and age <= 60) and (income >= 3000 or has_guarantor):
    print("贷款审批通过")
```

---

## 九、综合示例

```python
"""
BMI 计算器 + 健康建议
"""

print("=" * 35)
print("         BMI 计 算 器")
print("=" * 35)

height = float(input("请输入身高(m): "))
weight = float(input("请输入体重(kg): "))

bmi = weight / (height ** 2)
print(f"\n您的 BMI 值为: {bmi:.2f}")

if bmi < 18.5:
    category = "体重过轻"
    advice = "建议增加营养摄入，适当运动增肌"
elif 18.5 <= bmi < 24:
    category = "体重正常"
    advice = "保持良好生活习惯，定期体检"
elif 24 <= bmi < 28:
    category = "超重"
    advice = "控制饮食，增加有氧运动"
else:
    category = "肥胖"
    advice = "建议咨询医生，制定减重计划"

print(f"体型分类: {category}")
print(f"健康建议: {advice}")

# 使用 match-case（Python 3.10+）
match category:
    case "体重过轻" | "体重正常":
        print("✓ 健康状况良好")
    case "超重" | "肥胖":
        print("⚠ 需要关注体重管理")
```

---

## 十、常见陷阱

```python
# 陷阱 1：赋值而非比较
x = 10
# if x = 10:    # 语法错误！
if x == 10:
    print("正确")

# 陷阱 2：浮点数比较
a = 0.1 + 0.2
if a == 0.3:           # 可能为 False
    print("相等")
if abs(a - 0.3) < 1e-9:   # 正确做法
    print("近似相等")

# 陷阱 3：判断空值
value = None
if value == None:      # 可行但不推荐
    print("值为 None")
if value is None:      # 推荐做法
    print("值为 None")

# 陷阱 4：链式判断的误解
if 5 < x < 10:         # Python 支持，正确
    pass
# 不要写成 if 5 < x and x < 10（虽然等价，但不够简洁）
```

---

## 小结

- `if-elif-else` 处理多分支逻辑
- 三元表达式 `a if 条件 else b` 用于简单条件赋值
- `match-case`（Python 3.10+）提供强大的模式匹配能力
- 条件判断最终会转换为布尔值，`0`、`""`、`[]`、`None` 等为假
- 浮点数比较使用 `abs(a - b) < epsilon`
- 判断 `None` 使用 `is` 而不是 `==`

---

## 练习

1. 输入一个年份，判断是否为闰年（条件：能被 4 整除且不能被 100 整除，或能被 400 整除）。
2. 输入三个整数，按从大到小排序输出。
3. 使用 `match-case` 编写一个简单的命令行菜单程序。
4. 输入一个字符，判断它是大写字母、小写字母、数字还是其他字符。

