# 05第10节4 — type()侦探 + 强制类型转换
> **GESP等级：一级 | 考级考点：GESP Python 一级**


**关联GESP考点：GESP #29（数据类型识别）、GESP #19（类型转换）**

---

## 一、教学目标

### 知识目标
1. 理解 `type()` 函数的作用 —— 查询变量/数据的类型
2. 掌握四种强制类型转换函数：`int()`、`float()`、`str()`、`bool()
3. 理解除法运算结果始终为 `float` 类型
4. 区分"显式类型转换"与"隐式类型转换"

### 能力目标
1. 能用 `type()` 侦探式地检查任意数据的类型
2. 能在字符串与数字之间正确转换并参与运算
3. 能预测 `int(3.9)`、`float("2.5")` 等转换结果

### 情感目标
- 培养"调试意识"——遇到类型错误先用 `type()` 查类型
- 理解"不同类型的变量不能直接运算"，建立类型安全思维

---

## 二、教学重点与难点

| 类型 | 内容 |
|------|------|
| **重点** | `type()` 使用；`int()` / `float()` / `str()` 的转换规则 |
| **难点** | `int(3.9)` 截断而非四舍五入；除法永远返回 `float`；`bool()` 的真假判定规则 |
| **易错点** | `int("6.5")` 会报错（字符串含小数点不能直接转 int）；`str(123) + 4` 类型错误 |

---

## 三、教学过程

### 第一阶段：导入（00:00-10:00）

**主题：type() = 问电脑"你是什么类型？"**

引导语：
> 同学们，如果路边看到一只不认识的虫子，你会怎么办？——找昆虫学家鉴定！
> 那如果看到一个变量，不知道它是数字还是文字，怎么办？
> Python 里也有一个"鉴定专家"——`type()`，专门鉴定数据是什么类型！

**生活类比：**
- `type()` 就像照妖镜 —— 不管妖怪（数据）变成什么样，照一下就现出原形
- 也可以像侦探的放大镜 —— 仔细观察每个数据的"身份"

**板书示例：**
```python
name = "小明"
age = 10
print(type(name))   # <class 'str'>
print(type(age))    # <class 'int'>
```

---

### 第二阶段：知识点讲解（10:00-30:00）

#### 知识点①：`type(变量)` —— 查看类型

```python
a = 100
b = 3.14
c = "Hello"
d = True
e = [1, 2, 3]

print(type(a))  # <class 'int'>
print(type(b))  # <class 'float'>
print(type(c))  # <class 'str'>
print(type(d))  # <class 'bool'>
print(type(e))  # <class 'list'>
```

**记忆钩子：** `type = 照妖镜，照出类型`

#### 知识点②：`int()` —— 把文字变成整数

| 用法 | 结果 | 说明 |
|------|------|------|
| `int("6")` | `6` | 纯数字字符串 → 整数 |
| `int(3.9)` | `3` | **截断取整**，不是四舍五入！ |
| `int(True)` | `1` | `True` → 1 |
| `int(False)` | `0` | `False` → 0 |
| ❌ `int("6.5")` | 报错 | 字符串含小数点不行！ |
| ❌ `int("abc")` | 报错 | 非数字字符不行！ |

#### 知识点③：`float()` —— 文字变小数字

| 用法 | 结果 | 说明 |
|------|------|------|
| `float("2.5")` | `2.5` | 字符串 → 浮点数 |
| `float("3")` | `3.0` | 整数字符串 → 浮点数 |
| `float(5)` | `5.0` | 整数 → 浮点数 |
| ❌ `float("abc")` | 报错 | |

#### 知识点④：`str()` —— 数字变文字

| 用法 | 结果 | 说明 |
|------|------|------|
| `str(123)` | `"123"` | 整数 → 字符串 |
| `str(3.14)` | `"3.14"` | 浮点数 → 字符串 |
| `str(True)` | `"True"` | 布尔值 → 字符串 |

**记忆钩子：** `int() = 脱衣服（去掉引号变数字）`，`str() = 穿衣服（加上引号变文字）`

#### 知识点⑤补充：隐式类型转换——自动发生的转换（⭐ GESP二级重点）

有些转换不需要你写代码，Python 会自动完成——这叫**隐式转换**。

```python
# 情景1：int + float → 自动变 float（低精度→高精度）
result = 3 + 5.0
print(result)       # 8.0 ← 不是 8！
print(type(result)) # <class 'float'> ← 自动升成了 float！
```

**记忆钩子**："整数和小数在一起，Python自动变成小数——保护精度不丢失"

```python
# 情景2：bool 是特殊的整数！
print(True + 3)     # 4 ← True=1，所以 1+3=4
print(False * 5)    # 0 ← False=0，所以 0*5=0
```

**记忆钩子**："True是1，False是0——bool偷偷穿了int的马甲"

```python
# 情景3：什么情况不会自动转换？
# ❌ str + int → 报错！
# print("数字是：" + 42)  # TypeError!

# ✅ 必须显式转换
print("数字是：" + str(42))  # 数字是：42
```

**隐式vs显式对比**：
| 转换方式 | 谁做的 | 举例 | 结果 |
|---------|:------:|------|:----:|
| 隐式 | Python自动 | `3 + 5.0` | `8.0`（float） |
| 隐式 | Python自动 | `True + 3` | `4`（int） |
| 显式 | 你写代码 | `int("6")` | `6`（int） |
| 显式 | 你写代码 | `str(100)` | `"100"`（str） |

**口诀**："隐式自动升精度，bool藏着0和1；不同类型要运算，显式转换最保险"

#### 知识点⑤：`bool()` —— 真假判断

```python
print(bool(1))      # True
print(bool(0))      # False
print(bool("abc"))  # True（非空字符串）
print(bool(""))     # False（空字符串）
print(bool([]))     # False（空列表）
print(bool(None))   # False
```

**口诀：** "空的就是 False，有东西就是 True"

---

### 第三阶段：演示（30:00-40:00）

#### 核心演示：除法永远出 float！

```python
# 关键演示 —— 让学生猜结果
print(type(360 / 6))   # <class 'float'>  ← 60.0，不是整数！
print(type(10 / 2))    # <class 'float'>  ← 5.0
print(type(7 / 2))     # <class 'float'>  ← 3.5
print(type(9 / 3))     # <class 'float'>  ← 3.0，依然是 float！
```

**为什么？** Python 中 `/` 永远返回浮点数，即使能整除。

**对比演示：**
```python
print(10 / 3)     # 3.3333333333333335  ← float
print(10 // 3)    # 3                   ← int（整除）
print(10 % 3)     # 1                   ← int（取余）
```

#### 类型连锁反应演示

```python
a = 100
b = 3
print(type(a / b))    # float
print(type(a // b))   # int
print(type(a * b))    # int
print(type(a + b))    # int
print(type(a - b))    # int
```

---

### 第四阶段：实操（40:00-55:00）

#### 实操①：type 侦探填空

请同学补全下面代码，让每个 `print` 输出正确的类型描述：

```python
x = 3.14
print(type(x))   # 输出：______

y = "3.14"
print(type(y))   # 输出：______

z = 3.14 > 3
print(type(z))   # 输出：______

w = "3" + "14"
print(type(w))   # 输出：______

v = 10 / 2
print(type(v))   # 输出：______
```

**答案：** `<class 'float'>`、`<class 'str'>`、`<class 'bool'>`、`<class 'str'>`、`<class 'float'>`

#### 实操②：强制转换计算

```python
# 题目：int("6") + 2 = ?
print(int("6") + 2)    # 8
# 先 int("6") → 6，再 6 + 2 → 8

# 题目：int(3.9) = ?
print(int(3.9))        # 3（截断！不是4！）

# 题目：float("2.5") + 1 = ?
print(float("2.5") + 1)  # 3.5

# 题目：bool(1) + bool(1) = ?
print(bool(1) + bool(1))  # 2（True=1）
```

#### 实操③：字符串拼接与转换

```python
# str(123) + "4" = ?
print(str(123) + "4")   # "1234"
# 先 str(123) → "123"，再 "123" + "4" → "1234"

# 混合运算挑战
print(str(50) + str(50))     # "5050"
print(int("50") + int("50")) # 100
print(str(1 + 2) + "3")      # "33"（先算1+2=3，再str(3)="3"，再"3"+"3"="33"）
```

---

### 第五阶段：小测与总结（55:00-60:00）

#### 小测题目

```
1. int(3.9) = ？
   A. 3      B. 4      C. 3.9    D. 报错
   答案：A（截断取整）

2. type(360 / 6) 的结果是？
   A. int    B. float  C. str    D. bool
   答案：B（除法永远出 float）

3. int("6") + int("7") = ？
   A. "67"   B. 13     C. "13"   D. 报错
   答案：B（先转成数字再相加）

4. 下面哪个会报错？
   A. int("5")    B. float("3")    C. int("5.5")    D. str(100)
   答案：C（含小数点的字符串不能直接转 int）

5. bool("") 的结果是？
   A. True    B. False
   答案：B（空字符串为 False）

6. ⭐ 3 + 5.0 的结果和类型是？
   A. 8 (int)    B. 8.0 (float)    C. 报错
   答案：B（隐式转换：int+float→float）

7. ⭐ True + 3 的结果是？
   A. True    B. 4    C. 报错
   答案：B（True=1，1+3=4）
```

#### 课堂总结口诀

```
type 是照妖镜，照出类型现原形
int() 脱衣服，去掉引号变数字
str() 穿衣服，加上引号变文字
float() 戴帽子，整数变成小数字
bool() 判真假，空的假来有的真
除法永远出 float，千万要牢记心中
隐式转换自动升，int+float→float
True是1 False是0，算术里面装整数
```

---

## 四、板书设计

```
┌─────────────────────────────────────────┐
│  type()侦探 + 强制类型转换              │
│                                         │
│  type(变量) → 查类型                    │
│    ├── int   整数    例: 100            │
│    ├── float 浮点数  例: 3.14          │
│    ├── str   字符串  例: "Hello"       │
│    └── bool  布尔值  例: True/False    │
│                                         │
│  强制转换：                             │
│    int("6")    → 6   (截断！不是四舍五入)│
│    float("3")  → 3.0                    │
│    str(123)    → "123"                  │
│    bool(1)     → True                   │
│                                         │
│  ⚠ 除法永远出 float！                   │
│  type(360/6) → <class 'float'>          │
└─────────────────────────────────────────┘
```

---

## 五、课后反思

| 项目 | 记录 |
|------|------|
| 学生掌握较好的点 | |
| 学生易混淆的点 | |
| 需要补充练习的点 | |
| 下节调整建议 | |
