# 第18节：for循环动机
> **GESP等级：一级 | 考级考点：GESP Python 一级**


| 项目 | 内容 |
|------|------|
| 课程名称 | for循环动机——翻卡片游戏 |
| 课程时长 | 60分钟 |
| GESP考点 | #7 for循环基础 |
| 前置知识 | turtle模块、forward/right/left、画正方形 |
| 核心工具 | Python turtle模块、列表遍历 |

---

## 一、导入（10分钟）—— 手酸了！有没有更快方法？

### 1.1 旧知回顾：画正方形要几行？（3分钟）

> **老师提问：**
> "同学们，上节课我们学了画正方形，还记得怎么写吗？"
> "请一位同学来说说，画一个正方形需要几行代码？"

**预期互动：** 学生回答需要4行 `t.forward(100)` + 4行 `t.right(90)` = 共8行。

> **老师板书（或屏幕展示）：**

```python
import turtle
t = turtle.Turtle()

# 画正方形 —— 8行！
t.forward(100)
t.right(90)
t.forward(100)
t.right(90)
t.forward(100)
t.right(90)
t.forward(100)
t.right(90)

turtle.done()
```

> "画一个正方形要8行，还行。那——画一个十边形呢？"

### 1.2 制造痛点：十边形要写多少行？（4分钟）

> **老师引导：**
> "十边形有10条边，每条边走一步转一次——所以 forward 写10行，right 写10行。"
> "一共_______行？！"（让学生齐声回答：20行！）

> **老师夸张地揉手腕：**
> "哎呀，手都写酸了！20行啊！"
> "如果画一个50边形，就要写100行！那不得写到明天早上？"
> "同学们，你们有没有觉得——这些代码长得好像啊！"（指着黑板上的重复代码）

> **故意写一半停下，"演"出崩溃感：**
> ```
> t.forward(100)
> t.right(36)
> t.forward(100)
> t.right(36)
> t.forward(100)
> t.right(36)
> ...（写不下去了）
> ```
> "不写了不写了，太累了！"

### 1.3 抛出悬念：有没有更快的方法？（3分钟）

> **老师神秘地说：**
> "今天老师要教你们一个'偷懒大法'——只需要**3行代码**，就能画出一个正方形！"
> "而且！不管你要画正方形、三角形、六边形、还是100边形——都只用3行！"
> "想不想学？"

**预期回答：** "想！"

> "这个魔法就叫——**for循环**！"
> "它的作用就四个字：**让电脑重复做**！"

**记忆钩子首次引入：** "for = 让电脑重复做，你只要写一次"

> **板书大字：**
> ```
> for → 让电脑重复做，你只要写一次！
> ```

**GESP考点标注：【#7 for循环基础】**

---

## 二、知识点讲解（20分钟）—— for循环 = 翻卡片游戏

### 2.1 引入"翻卡片"概念（5分钟）

> **老师拿出道具（或PPT展示）：**
> "想象一下，老师手里有4张卡片，上面分别写着：1、2、3、4。"
> "我一张一张翻过来给大家看——"
> "翻开第1张：'1'，翻开第2张：'2'，翻开第3张：'3'，翻开第4张：'4'。"

> **老师说：**
> "这个过程，就是 **for循环** 在做的事情！"
> "'翻卡片'就是一次一次从盒子里取东西出来。"
> "在Python里，这个'盒子'就是 `[1, 2, 3, 4]` —— 我们叫它**列表**。"

**身体锚点：** 老师说"翻卡片"时，用手做"翻"的动作——大拇指和食指捏住，翻转手腕。每说一个数字翻一次。"for一次翻一张"。

> **板书：**

```
for i in [1, 2, 3, 4]:    ← "对于在[1,2,3,4]里的每一个，轮流来"
   翻卡片                 ← 每次翻一张，i 就是卡片上的数字
```

> "第一轮：i = 1，我来翻第一张卡，上面是1"
> "第二轮：i = 2，我来翻第二张卡，上面是2"
> "第三轮：i = 3，我来翻第三张卡，上面是3"
> "第四轮：i = 4，我来翻第四张卡，上面是4"
> "翻完4张，结束！"

### 2.2 拆解 for 语法结构（5分钟）

> **老师板书完整语法：**

```python
for i in [1, 2, 3, 4]:
    print("翻到卡片啦！数字是：", i)
```

**逐词拆解：**

| 部分 | 童趣解释 | 真实含义 |
|------|---------|---------|
| `for` | "对于……每一个" | for 循环关键字 |
| `i` | "翻出来的卡片" | 循环变量（每次取一个值） |
| `in` | "在……里面" | 遍历操作符 |
| `[1,2,3,4]` | "卡片盒" | 列表（可遍历的集合） |
| `:` | "准备开始……" | 冒号，循环头结束 |
| 缩进的代码 | "翻到卡片后做的事" | 循环体 |

**记忆钩子强化：** "for i in [1,2,3,4] = 从卡片盒里依次抽出1、2、3、4四张卡"

> **互动演练（老师带全班一起念）：**
> 老师："for i in [1,2,3,4] ——"
> 学生齐答："从卡片盒1、2、3、4里轮流抽卡！"
> 老师："冒号 ——"
> 学生："准备开始！"

**GESP考点标注：【#7 for循环基础】**

### 2.3 缩进 = 在循环里（蹲下游戏）（5分钟）

> **老师说：**
> "现在我们来玩个游戏！"
> "老师喊：'for i in [1,2,3,4]:' —— 全班准备！"
> "然后我念缩进里的代码——被我念到的同学，**蹲下！**"
> "为什么蹲下？因为缩进 = 蹲下，表示你在循环里面！"

**身体锚点：** "缩进=蹲下" —— 老师说"缩进"时做下蹲动作，表示"在循环范围里面"。

> **老师演示对比：**

```python
# 在循环里面（缩进了）—— 每次循环都做
for i in [1, 2, 3, 4]:
    print("我蹲下了")       # 会打印4次
    print("我也在循环里")    # 也会打印4次

# 在循环外面（没缩进）—— 只做一次
print("我出来了")           # 只打印1次
```

> **指令游戏（全班互动，2分钟）：**
> 1. 老师说 "for i in [1,2,3,4]:" → 全部举手准备
> 2. 老师说 "拍手"（缩进内）→ 全班拍手4次（因为循环4次）
> 3. 老师说 "说'哈！'"（缩进内）→ 全班说"哈！"4次
> 4. 老师说 "说'循环结束'"（不缩进）→ 全班说一次

> **关键提问：**
> - ❓ "为什么拍手拍了4次？"（因为循环了4次）
> - ❓ "为什么'循环结束'只说了一次？"（因为它不在缩进里，在循环外面）

**GESP考点标注：【#7 for循环基础】**

### 2.4 for让电脑重复做事（5分钟）

> **老师说：**
> "现在我们来真正体验一下 for 的威力！"
> "记住那句口诀：**for = 让电脑重复做，你只要写一次**"

> **对比展示（PPT或板书）：**

| 场景 | 不用for（手写法） | 用for |
|------|-----------------|-------|
| 拍手3次 | 拍手、拍手、拍手 | for i in [1,2,3]: 拍手 |
| 说"你好"5次 | print("你好")写5行 | for i in [1,2,3,4,5]: print("你好") |
| 画正方形4条边 | forward+right写4遍 | for i in [1,2,3,4]: forward+right |

> **引导发现规律：**
> - "不用for的时候，重复几次就要写几行"
> - "用了for，不管重复多少次——都只写**一行**循环头 + **一行**循环体"
> - "多出来的工作，电脑帮你做了！"

> **老师夸张总结：**
> "for循环就是'偷懒神器'！"
> "你懒，电脑勤快——完美搭档！"

**记忆钩子强化：** "for=让电脑重复做，你只要写一次"

> **过渡到演示环节：**
> "好了，理论学完了，现在来看真正的魔法——用3行代码画正方形！"

**GESP考点标注：【#7 for循环基础】**

---

## 三、演示（10分钟）—— 3行顶8行！

### 3.1 打开IDLE，新建文件（2分钟）

> **老师操作，学生同步：**
> 1. 打开 IDLE → File → New File
> 2. 保存为 `01_for动机.py`

### 3.2 逐行敲代码（5分钟）

> **老师说：**
> "看好了，我要变魔术了！"
> "3行代码画正方形——这3行是循环部分，再加上头尾，总共也没几行！"

```python
import turtle
t = turtle.Turtle()
t.shape("turtle")

# 魔法时刻：3行代替8行！
for i in [1, 2, 3, 4]:
    t.forward(150)
    t.right(90)

turtle.done()
```

> **一边敲一边讲解：**
> - `for i in [1, 2, 3, 4]:` → "卡片盒里有4张卡，循环4次"
> - `t.forward(150)` → "每次循环，往前走150步"（缩进！蹲下！在循环里）
> - `t.right(90)` → "每次循环，右转90度"（缩进！也在循环里！）
> - 没有缩进的 `turtle.done()` → "出了循环，只做一次"

> **指着屏幕问：**
> - "forward和right这两行，缩进了吗？"（缩进了）
> - "那它们会被执行几次？"（4次！）
> - "为什么刚好画出一个正方形？"（走4次，每次转90度，4×90=360度）

### 3.3 运行程序，看效果（2分钟）

> **按F5运行：**
> "哇！小乌龟真的画出了一个正方形！"
> "而且只有3行核心代码！对比之前要8行——是不是超级省力？"

### 3.4 和8行版本对比（1分钟）

> **老师展示左右对比：**

```
【不用for】8行                          【用for】3行
t.forward(150)                         for i in [1,2,3,4]:
t.right(90)                                t.forward(150)
t.forward(150)                            t.right(90)
t.right(90)
t.forward(150)
t.right(90)
t.forward(150)
t.right(90)
```

> **引导提问：**
> - ❓ "左边和右边画出来的图形一样吗？"（一样！都是正方形）
> - ❓ "哪个写法更省力？"（右边！）
> - ❓ "如果画十边形，左边要写多少行？右边呢？"（左边20行，右边还是3行！）

> **全班惊讶：** "哇——！！！"

---

## 四、实操练习（15分钟）—— 自己试试for循环

### 4.1 练习一：补全for画正方形（5分钟）

**难度：** ⭐

**GESP考点：【#7 for循环基础】**

> **题目：** 下面的代码有空白，请补全它，让乌龟画出一个正方形。

```python
import turtle
t = turtle.Turtle()

# 请补全下面的for循环，让乌龟画正方形
for i in [____, ____, ____, ____]:
    t.forward(100)
    t.____(90)

turtle.done()
```

**需要填的空：**
1. `[1, 2, 3, 4]`（或者任何4个数字的列表）
2. `right`（右转）

> **检查清单：**
> - [ ] 列表里有4个数字吗？
> - [ ] `right` 拼写正确吗？
> - [ ] forward和right都缩进了吗？（前面有4个空格或1个Tab）
> - [ ] 运行后画出了正方形吗？

**预期结果：** 画出一个边长为100的正方形。

**如果学生完成得快：** 把数字改成 `[10, 20, 30, 40]` 试试，看看画出来是不是还是正方形？（是的，循环次数不变，只改变i的值，但这里i没有在循环体里使用，所以不影响图形）

---

### 4.2 练习二：改成三角形（5分钟）

**难度：** ⭐⭐

**GESP考点：【#7 for循环基础】**

> **题目：** 在上面正方形代码的基础上，修改为画**三角形**。
>
> **提示：** 三角形有3条边，每次转120度。

**思考引导：**
- ❓ "正方形循环几次？"（4次）
- ❓ "三角形要循环几次？"（3次！）
- ❓ "正方形每次转多少度？"（90度）
- ❓ "三角形每次转多少度？"（120度！因为3×120=360）

**参考代码：**

```python
import turtle
t = turtle.Turtle()

for i in [1, 2, 3]:       # 改了这里！3次
    t.forward(150)
    t.right(120)           # 改了这里！120度

turtle.done()
```

**预期结果：** 画出一个三角形。

> **追问：**
> - ❓ "如果把 `t.right(120)` 改成 `t.left(120)`，三角形会朝哪边画？"（左边）
> - ❓ "把forward改成200，三角形变大还是变小？"（变大）

---

### 4.3 练习三：改成六边形（5分钟）

**难度：** ⭐⭐

**GESP考点：【#7 for循环基础】**

> **题目：** 继续修改代码，这次画**六边形**。
>
> **提示：** 六边形有6条边，每次转60度（因为6×60=360）。

**参考代码：**

```python
import turtle
t = turtle.Turtle()

for i in [1, 2, 3, 4, 5, 6]:    # 改了这里！6次
    t.forward(100)
    t.right(60)                   # 改了这里！60度

turtle.done()
```

**预期结果：** 画出一个六边形。

> **终极追问（探索引导）：**
> - ❓ "如果我要画八边形，for循环怎么写？"
> - ❓ "如果我要画十边形，for循环怎么写？"
> - ❓ "你发现了什么规律？"

> **引导总结规律：**
> ```
> 边数 = 循环次数
> 转角 = 360 ÷ 边数
> ```

> **学生惊叹时刻：**
> "原来不管多少边形——都是3行代码！"
> "只要改两个数字：循环次数和角度！"

---

## 五、小测验（5分钟）—— 口答抢答

### 5.1 核心概念快问快答

| 题号 | 问题 | 答案 | 考点 |
|------|------|------|------|
| 1 | `for i in [1,2,3,4]:` 循环几次？ | 4次 | 【#7】循环次数 |
| 2 | 循环体靠什么来标记"在循环里"？ | 缩进（4个空格） | 【#7】缩进规则 |
| 3 | `for` 的中文意思是？ | "对于……每一个" | 【#7】关键字理解 |
| 4 | 以下哪个在循环里？`print("A")` 缩进了，`print("B")` 没缩进 | A | 【#7】缩进判断 |
| 5 | 用for画正方形要循环____次？ | 4次 | 【#7】实际应用 |
| 6 | for循环的好处是什么？ | 让电脑重复做，你只要写一次 | 【#7】循环意义 |

### 5.2 代码纠错挑战

> "下面的代码有3个错误，请找出来！"

```python
import turtle
t = turtle.Turtle()

for i in [1 2 3 4]
    t.forward(100)
t.right(90)

turtle.done()
```

**错误：**
1. `[1 2 3 4]` → 数字之间要加逗号：`[1, 2, 3, 4]`
2. `for i in [1, 2, 3, 4]` → 漏了冒号`：`
3. `t.right(90)` → 没有缩进，不在循环里！画出来的不是正方形，是一条直线+一个转角

### 5.3 预测输出题

> "运行下面的代码，乌龟会画什么？为什么？"

```python
for i in [1, 2, 3]:
    t.forward(100)
    t.right(120)
```

**答案：** 三角形。循环3次，每次走100步转120度，3×120=360度。

### 5.4 课堂总结（1分钟）

> "今天我们学会了世界上最强大的'偷懒工具'——**for循环**！"
>
> "记住三件事："
> 1. **"for = 让电脑重复做，你只要写一次"**
> 2. **"缩进 = 在循环里面"**（蹲下！）
> 3. **"for i in [1,2,3,4] = 翻卡片"**（循环几次取决于列表里有几张卡）
>
> "有了 for 循环，画正方形只要3行！画三角形3行！画六边形3行！画100边形也是3行！"
>
> "下次课，我们学一个更厉害的——不用自己写[1,2,3,4,5,6...]，用 **range** 自动生成！"

---

## 附录：常见问题与应对

| 问题 | 应对策略 |
|------|---------|
| 学生不理解 `i` 是什么 | 用翻卡片比喻：i就是翻出来的那张卡，第一轮i=1，第二轮i=2…… |
| 忘记加冒号 `:` | 口诀："for后面跟冒号，就像说'开始了'！" |
| 忘记缩进 | 身体锚点："缩进=蹲下，不蹲下就不在循环里！" |
| 列表里忘记加逗号 | 强调："数字之间用逗号隔开，就像排队一样一个一个来" |
| 学生问为什么i不用提前定义 | 简单回答："for循环会自动从列表里取，你不用管它从哪里来" |
| 循环次数和边数搞混 | 画图规律：循环几次=画几条边，直接对应！ |
| 角度算错 | 告诉规律：转的角度 × 边数 = 360（转一圈回到起点） |
