# 第09节教案 —— 四种类型：int/float/str/bool + None（60分钟·GESP #28）
> **GESP等级：一级 | 考级考点：GESP Python 一级**


> **GESP 考点**：#28 数据类型基本概念、str/ int/ float/ bool/ None 的识别与区分
> **教学形式**：turtle场景导入（0-10min）→ 知识点讲解（10-30min）→ 上机演示（30-40min）→ 实操练习（40-55min）→ 收尾小测（55-60min）
> **时长**：60 分钟（完整一节）| **对应文件**：`第09节_四种类型.py`、`课后练习卡_第09节_四种类型.md`、`课堂练习册_第09节_四种类型.md`
> **核心定位**：类型识别地基课——每个孩子必须能用"记忆钩子"一眼辨认四种基本类型和 None。

---

## GESP 知识映射

| GESP-1 考点 | 本节对应 | 身体锚点 |
|------------|---------|---------|
| #28 数据类型概念 | 每种类型的值有"长相"特征，type() 能查出类型 | 用"外貌特征"辨认类型 |
| #28 str | 文字穿引号——"red"、"hello"、'A' | 双手比引号：🙌 穿引号！ |
| #28 int | 光膀子整数——6、100、-3 | 露胳膊：💪 光膀子！ |
| #28 float | 带小数点——3.14、0.5、-2.0 | 手指点一下：👆 有点！ |
| #28 bool | 是/否——True、False | 点头/摇头：👍/👎 是或否 |
| #28 None | 空盒子——None | 摊开空手：🖐️ 空的！ |
| #28 type() 函数 | type(值) 返回类型名称 | "照妖镜"照出类型 |

---

## 教学目标

孩子下课后能：

- **准确说出 5 种类型的中文名和英文名**：str(字符串)、int(整数)、float(浮点数)、bool(布尔)、NoneType
- **用记忆钩子辨认类型**："str穿引号 int光膀子 float小数点 bool是/否 None空盒子"
- **正确区分 `"6"` 和 `6`**——前者是 str（穿引号），后者是 int（光膀子）
- **用 `type()` 函数查询任意值的类型**
- **理解 None 表示"什么都没有"——不是 0，不是 False，是空盒子**
- **独立完成连线题、判断填空题**

---

## 教学节奏总览

| 时间段 | 时长 | 阶段 | 核心内容 | 身体锚点 | 关键记忆句 |
|--------|------|------|---------|---------|-----------|
| 0-10min | 10min | 导入：turtle场景 | 颜色名(str)→边数(int)→角度(float)→画笔状态(bool) | 指着turtle每个参数问"这是什么类型" | "每种参数有固定的类型要求" |
| 10-30min | 20min | 知识点讲解 | ①str穿引号②int光膀子③float小数点④bool是/否⑤None空盒子 | 五项身体动作：引号/光膀子/点一下/点头摊手/空盒子 | "str穿引号 int光膀子 float小数点 bool是/否 None空盒子" |
| 30-40min | 10min | 上机演示 | type("red")→str / type(6)→int / 演示全部5种 | 老师敲代码，学生齐喊答案 | "type()是照妖镜——一照就知道是什么类型" |
| 40-55min | 15min | 实操练习 | ①连线值↔类型 ②判断"6"和6的区别 ③None用法填空 | 同桌互改 | "穿引号的是文字，光膀子的是数字" |
| 55-60min | 5min | 收尾小测 | "None是什么类型？" 全班齐答+齐读记忆口诀 | 摊开空手 | "None空盒子——里面什么都没有" |

> **节奏逻辑**：具象turtle（0-10min）→ 抽象讲解（10-30min）→ 半具象演示（30-40min）→ 应用练习（40-55min）→ 记忆强化（55-60min）

---

## 课前准备

### 讲台道具清单
- **5张类型标签卡**（A4卡纸，正反面）：str / int / float / bool / NoneType
- **10张值卡片**（可磁吸或手举）：`"red"`、`6`、`3.14`、`True`、`None`、`"hello"`、`100`、`0.5`、`False`、`"6"`
- **5张身体动作提示卡**：🙌穿引号 / 💪光膀子 / 👆有点 / 👍是/👎否 / 🖐️空盒子
- **一支马克笔**、**磁贴或透明胶**（贴黑板用）

### 黑板/白板布局
- **正中顶部**：大字标题 **🔤 四种类型 + None**
- **左侧 1/3**：类型特征区（5种类型 + 记忆钩子 + 例子）
- **中央 1/3**：代码区（`type("red")` → `<class 'str'>` 等5条）
- **右侧 1/3**：连线练习区（值 ↔ 类型）

### 学生电脑环境
- 每台电脑已开机，Python/Thonny 已打开
- 桌面放置 `第09节_四种类型.py`

### 其他材料
- **课堂练习纸**：每人一张（含3道题），课前放座位右上角
- **课后练习卡**：`课后练习卡_第09节_四种类型.md` 打印版，下课时发放

---

## 教学流程

### 阶段一：导入——turtle场景四种类型（0-10min）

> **目标**：通过turtle画画，自然接触四种类型的值，建立"每个值都有类型"的直觉

**步骤 1：打开turtle画彩色多边形（3min）**

- 老师打开演示代码，展示一段 turtle 画画代码，逐行提问：

```python
import turtle
t = turtle.Turtle()
t.shape("turtle")

# 4行代码，4种类型
color_name = "red"      # 这是什么？→ 颜色名字，用引号包着
sides = 6               # 这是什么？→ 边数，没有引号的整数
angle = 360 / 6         # 这是什么？→ 角度，带小数点（60.0）
pen_down = True         # 这是什么？→ 画笔落下的状态，是/否

t.color(color_name)
for i in range(sides):
    t.forward(100)
    t.left(angle)

print("画笔落下了吗？", pen_down)
```

- 每指一行，让学生猜"这个值长什么样"
- 引出核心问题：**"同样是值，为什么有的穿引号，有的光膀子，有的带点，有的是True/False？"**

**步骤 2：逐个讲解4个变量中的类型特征（5min）**

拿着实物卡片 —— 每个值对应一张卡片：

| 代码中的值 | 外观特征 | 老师的身体动作 | 类型叫什么 |
|-----------|---------|:------------:|:---------:|
| `"red"` | 有引号包裹 | 双手在耳边比引号🙌 | **字符串 str** |
| `6` | 赤裸整数，没有小数点 | 拍拍胳膊💪 | **整数 int** |
| `60.0` | 有小数点 | 手指点一下👆 | **浮点数 float** |
| `True` | 是/否，大写开头 | 点头或摇头👍/👎 | **布尔 bool** |

**步骤 3：引出第五种——None 空盒子（2min）**

- 老师问："假如小乌龟没有颜色——我该填什么？"
- 展示 `t.color(None)` —— 没有颜色
- "None 是 Python 里一个特殊的值，表示**空盒子**——里面什么都没有"
- 身体动作：摊开双手🖐️
- **记忆钩子初登场**（老师先说一遍，学生跟读一遍）：
  > **"str穿引号 int光膀子 float小数点 bool是/否 None空盒子"**

---

### 阶段二：知识点讲解（10-30min）

> **目标**：系统讲解 5 种类型，每个类型配一个身体动作

#### 知识点①：str——字符串 = 文字穿引号（4min）

**板书**：
```
str = string = 字符串
长得像：  "文字"  或  '文字'
特征：   有引号包着（单引号或双引号）
例子：    "red"  "hello"  "100"  "3.14"  'A'  ""
```

- 重点强调：**数字穿了引号也是 str**——比如 `"6"` 是 str，不是 int！
- 空字符串 `""` 也是 str——"穿了一件看不见的引号衣服"
- 身体动作：双手在耳边比引号🙌 齐喊 **"穿引号！"**

**互动：老师举卡片，学生判断是不是 str**
- `"red"` → ✅ str（穿引号）
- `6` → ❌ 不是 str（光膀子）
- `"6"` → ✅ str（穿了引号）
- `hello`（没引号）→ ❌ Python会报错，因为它既不是str也不是其他类型

#### 知识点②：int——整数 = 光膀子整数（4min）

**板书**：
```
int = integer = 整数
长得像：  不带小数点的数字，没有引号
特征：   光膀子——没有引号，没有小数点
例子：    6  100  -3  0  999
```

- 关键点：**int 不能穿引号，也不能带小数点**
  - `6` → ✅ int
  - `"6"` → ❌ 这是 str（因为穿了引号）
  - `6.0` → ❌ 这是 float（因为带了小数点）
- 身体动作：拍拍胳膊💪 齐喊 **"光膀子！"**

**对比强调**：
```
"6"   ← 穿引号 → str
 6    ← 光膀子 → int
```

#### 知识点③：float——浮点数 = 带小数点（3min）

**板书**：
```
float = floating-point = 浮点数
长得像：  带小数点的数字，没有引号
特征：   有一个小数点
例子：    3.14  0.5  -2.0  100.0
```

- 教学技巧：**"只要看到小数点，就是 float"**
- 即使是 `100.0` 也是 float——"虽然它等于100，但它带了小数点，所以是 float"
- 身体动作：用食指点一下👆 齐喊 **"带小数点！"**

**对比三连**：
```
"6"   → str（穿引号）
 6    → int（光膀子）
 6.0  → float（带小数点）
```

#### 知识点④：bool——布尔 = 是/否（4min）

**板书**：
```
bool = boolean = 布尔值
长得像：  True  或  False
特征：   只有两个值——大写开头
例子：    True（真/是）  False（假/否）
```

- 只有两个值：**True**（是的，对的，真的）和 **False**（不是的，错的，假的）
- 注意：**首字母大写**——`true` 和 `false` 都是错的！
- 生活中哪些是布尔值？
  - 灯亮着吗？→ True / False
  - 今天下雨吗？→ True / False
  - 密码正确吗？→ True / False
- 身体动作：👍（True）或 👎（False）齐喊 **"是或否！"**

#### 知识点⑤：None——空盒子（3min）

**板书**：
```
None = 空盒子 / 什么都没有
长得像：  None
特征：   表示"没有值"——不是0，不是False，而是什么都没有
例子：    None
```

- **None 不是 0！**——0是一个数字，None是什么都没有
- **None 不是 False！**——False是"否"的判断，None是"没有"
- 生活中的类比：
  - 书包里什么都没有 → None
  - 钱包里一分钱都没有 → 0（不是None）
  - 妈妈问你带零食了吗？→ "没有"（None），不是"带了一个"（0个是0）
- 身体动作：摊开双手🖐️ 齐喊 **"空盒子！"**

#### 知识点⑥：拓展——`is` 和 `==` 有什么区别？（3min）

**⭐ GESP考点补充：`is`（身份比较）vs `==`（值比较）**

**故事**："双胞胎兄弟"
- 小明和小强是双胞胎，长得一模一样（值相等 = `==`）
- 但他们是**两个不同的人**（身份不同 = `is` 不同）

```python
a = [1, 2, 3]
b = [1, 2, 3]
c = a

print(a == b)    # True  ← 长得一样（值相等）
print(a is b)    # False ← 不是同一个人（不同盒子）
print(a is c)    # True  ← c 就是 a 的别名（同一个盒子）
```

**记忆钩子**：
- `==` = "双胞胎比长相"（值相等就算对）
- `is` = "查身份证"（必须是同一个人）

**记忆口诀**：
> **"==两个等号比内容，is一个身份查到底"**

**身体锚点**：
- `==` = 双手比划一样大的形状
- `is` = 指同一个人的方向（食指指着自己）

**对于7-10岁孩子**：先记住一条实用规则——
> **"比较 None 的时候，永远用 `is None`，不用 `== None`"**

```python
# ✅ 正确的写法
if x is None:
    print("x是空的")

# ❌ 不推荐的写法（虽然也能用）
if x == None:
    print("x是空的")
```

#### 知识点梳理（2min）

**记忆钩子完整版（全班起立，带动作齐读两遍）**：

```
str   穿引号  🙌  双手在耳边比引号
int   光膀子  💪  拍拍胳膊
float 带小数点 👆  食指点一下
bool  是或否  👍👎  先竖大拇指再倒过来
None  空盒子  🖐️  摊开双手
```

---

### 阶段三：上机演示——type() 照妖镜（30-40min）

> **目标**：用 type() 验证每种值的类型，建立"type()是用来查类型的函数"的认知

**演示 1：type() 的基本用法（3min）**

```python
# type() 就像一面"照妖镜"——照一下就知道是什么类型
print(type("red"))    # → <class 'str'>
print(type(6))        # → <class 'int'>
print(type(3.14))     # → <class 'float'>
print(type(True))     # → <class 'bool'>
print(type(None))     # → <class 'NoneType'>
```

- 老师逐行运行，学生齐读输出结果
- 注意 None 的类型叫 **NoneType**——是唯一的！
- **记忆句**："type() 是照妖镜——一照就知道是什么类型"

**演示 2：区分 "6" 和 6 和 6.0（3min）**

```python
print(type("6"))    # → <class 'str'>   穿了引号就是str
print(type(6))      # → <class 'int'>   光膀子就是int
print(type(6.0))    # → <class 'float'>  带小数点就是float
```

- 老师提问："6" 和 6 长得像吗？——像，但一个是文字，一个是数字

**演示 3：用 type() 验证生活中的值（2min）**

```python
print(type("你好"))    # → str
print(type(100))       # → int
print(type(-0.5))      # → float
print(type(False))     # → bool
```

- 让学生先猜，再运行验证

**演示 4：type() 返回值也是类型——类型本身也是值（2min）**

```python
t1 = type("red")
print(t1)             # → <class 'str'>
print(type(t1))       # → <class 'type'>  类型的类型是 type！
```

- 简单带过，不必深究——引起兴趣即可

---

### 阶段四：实操练习（40-55min）

> **目标**：三道练习题，巩固类型识别能力

**练习 1：连线——把值和类型连起来（5min）**

```
左边的值         右边的类型
"red"    ────    int
6        ────    str
3.14     ────    bool
True     ────    NoneType
None     ────    float
```

答案：`"red"→str`、`6→int`、`3.14→float`、`True→bool`、`None→NoneType`

**练习 2：辨析题——"6" 和 6 有什么区别？（5min）**

```
"6" 的类型是：__________（提示：穿了引号）
 6  的类型是：__________（提示：光膀子）

"6" 可以做什么：________________________________
 6  可以做什么：________________________________

想一想：6 + 6 = ?
想一想："6" + "6" = ?  （提示：试试在Python里运行）
```

答案：
- `"6"` 的类型是 str；`6` 的类型是 int
- `"6"` 可以做文字拼接（"66"）；`6` 可以做算术运算（12）
- `6 + 6 = 12`；`"6" + "6" = "66"`（字符串拼接！）

**练习 3：None 用法填空（5min）**

```
① 在Python中，None 表示__________（提示：空盒子）

② None 和 0 一样吗？_____ 为什么？
   0 是__________，None 是__________

③ 判断对错：True / False
   ( ) None = 0
   ( ) type(None) 的结果是 <class 'NoneType'>
   ( ) None 也可以写成 none（首字母小写）
   ( ) 一个变量如果没赋值，默认值是 None
```

答案：
① 什么都没有
② 不一样；0 是一个数字（int），None 表示"没有值"
③ ❌、✅、❌（必须大写）、✅（知识拓展：未赋值的变量其实是 undefined，但 None 常用来表示"空"）

**讲评（5min）**
- 老师逐题讲解
- 练习 2 重点讲字符串拼接和算术运算的区别
- 练习 3 重点讲 None 不是 0

---

### 阶段五：收尾小测 + 记忆钩子强化（55-60min）

**小测问题**（全班起立，举手回答）：

> **"None 是什么类型？"**

参考答案：
- None 的类型是 `NoneType`
- 用 `type(None)` 验证 → `<class 'NoneType'>`
- None 表示"空盒子"——不是0，不是False，什么都没有

**全班齐读记忆钩子（2遍，带动作）**：

```
str   穿引号  🙌  （双手在耳边比引号）
int   光膀子  💪  （拍拍胳膊）
float 带小数点 👆  （食指点一下）
bool  是或否  👍👎（先竖大拇指再倒过来）
None  空盒子  🖐️  （摊开双手）
```

**布置课后练习卡**
- 发放 `课后练习卡_第09节_四种类型.md` 打印版
- 预告下一节："下节课我们学 `type()` 和类型转换——把一种类型变成另一种类型，超级魔法！"

---

## 板书设计（终版）

```
╔═══════════════════════════════════════════════════════════════╗
║          🔤 四种类型 + None                                 ║
╠═══════════════════╦════════════════════╦═════════════════════╣
║  类型 + 记忆钩子   ║  代码             ║  连线练习           ║
║                   ║                   ║                     ║
║  str  穿引号 🙌   ║  type("red")→str  ║  "red"  ────  ?    ║
║  int  光膀子 💪   ║  type(6)→int      ║  6      ────  ?    ║
║  float 带小数点👆 ║  type(3.14)→float ║  3.14   ────  ?    ║
║  bool 是或否 👍👎 ║  type(True)→bool  ║  True   ────  ?    ║
║  None 空盒子 🖐️  ║  type(None)→None  ║  None   ────  ?    ║
║                   ║                   ║                     ║
║  ★"6" vs 6 vs 6.0║  ★区别三连        ║  "6"→str           ║
║  穿引号/光膀子/点 ║  str/int/float    ║   6→int            ║
╠═══════════════════╩════════════════════╩═════════════════════╣
║  记忆钩子：str穿引号 int光膀子 float小数点 bool是/否 None空盒子  ║
║  type() 是照妖镜——一照就知道是什么类型                         ║
╚═══════════════════════════════════════════════════════════════╝
```

---

## 差异化教学

| 学生类型 | 表现 | 应对策略 |
|---------|------|---------|
| 快进型 | 3 分钟做完练习，开始分心 | 额外挑战：给出 10 个混合值（含 "100"、100、100.0、True、None、""、0、False、"False"、"3.0"），让学生按 5 种类型分类 |
| 慢热型 | 分不清 "6" 和 6 | 用实物卡片反复练习：穿引号的卡片和光膀子的卡片放到两个盒子里，至少操作 5 次 |
| 概念混淆型 | 认为 None = 0 或 None = False | 用三个盒子演示：空盒子（None）、装了 0 的盒子（int 0）、装了 False 的盒子（bool False）——让学生伸手摸，感受"空盒子"和"装了东西的盒子"的区别 |

---

## 课后反思（教师填写）

| 项目 | 评价 | 备注 |
|------|:----:|------|
| 教学目标达成度 | /5 | |
| 学生参与度 | /5 | |
| 时间把控 | /5 | |
| 需改进点 | | |
