> **GESP等级：三级 | 考级考点：GESP Python 三级**

# 第11节：列表推导式——"魔法压缩饼干"

---

## 课程概览

| 项目 | 内容 |
|------|------|
| 课程名称 | 列表推导式（List Comprehension） |
| 课程时长 | 60分钟 |
| 前置知识 | 列表基础、for循环、if条件判断 |
| 核心概念 | 列表推导式、表达式生成、条件过滤、嵌套循环 |

---

## 教学目标

### 知识与技能目标
1. **理解**：知道列表推导式是"用一句话生成列表"的快捷写法
2. **掌握**：能写出 `[表达式 for 变量 in 列表]` 的基本语法
3. **进阶**：能用 `if` 条件过滤列表推导式
4. **挑战**：了解嵌套for循环的列表推导式
5. **应用**：能用列表推导式生成turtle的坐标和颜色数据

### 过程与方法目标
- 通过"压缩饼干"的比喻理解列表推导式的本质
- 通过"拆开包装"的练习将推导式还原为for循环
- 通过turtle绘图看到列表推导式的实际效果

### 情感态度目标
- 感受代码从"啰嗦"变"简洁"的成就感
- 建立"Python代码可以很优雅"的审美意识
- 培养用简洁方式解决问题的思维习惯

---

## 教学准备

### 硬件准备
- 电脑（每人一台或两人一台）
- 投影仪/大屏幕
- 黑板/白板

### 软件准备
- Python IDLE 或 Thonny IDE
- turtle 模块（Python内置，无需安装）
- 事先准备好的示例代码

### 教学材料
- 星星贴纸（奖励用）
- 彩色粉笔/马克笔
- 记忆卡片："列表推导式口诀卡"
- 流程图海报（for循环→推导式对照图）

### 教师提前准备
- 在自己的电脑上运行一遍所有代码示例
- 准备"压缩饼干"实物或图片作为导入道具
- 将代码示例放大打印或做成PPT

---

## 身体锚点与记忆钩子设计

### 核心锚点：魔法压缩饼干

```
列表推导式 = 魔法压缩饼干

for循环（普通写法）
  新列表 = []
  for 数 in 范围:
      新列表.append(数)
  （松散多行）

      双手合拢（压缩动作）

  新列表 = [数 for 数 in 范围]
  （一行搞定）

压缩饼干 → 泡水变大 = 拆解回for循环
```

### 身体锚点对照表

| 锚点名称 | 动作描述 | 对应概念 | 使用时机 |
|---------|---------|---------|---------|
| 双手合拢（压缩） | 双手在胸前做挤压动作，像把空气压成小球 | 将多行for循环压缩成一行列表推导式 | 讲解基本语法时 |
| 双手张开（展开） | 双手从胸前向两侧打开 | 把列表推导式拆解回for循环 | 分析代码时 |
| 单手做"停" | 手掌立起，像交警说停 | if条件过滤，筛掉不符合的元素 | 讲解条件过滤时 |
| 双手画圈 | 双手交替画圈，像在搅拌 | 嵌套for循环，一层套一层 | 讲解嵌套时 |
| 手指点向屏幕 | 食指指向投影 | 表达式生成，每个元素都要处理 | 讲解表达式部分时 |

### 记忆钩子（口诀）

```
【核心口诀】
"for画图 if过滤，一句生成新列表"

【分解口诀】
"方括号里写公式，for字前面是表达式"
"for字后面循环跑，if字后面是条件"
"想要多层怎么办？for字再写一个for"

【节奏拍手口诀】（配合拍手节奏）
一拍：列-表-推-导-式  （拍手4下）
二拍：for-if-压-一-行 （拍手4下）
三拍：不-用-啰-嗦-写-循-环 （拍手6下）
四拍：一-句-代-码-生-成-完 （拍手7下）
```

### 视觉记忆卡片

```
记忆卡 #1
列表推导式 = 压缩饼干

[表达式 for 变量 in 列表]
   |        |     |     |
   |        |     |     数据源
   |        |     循环变量
   |        关键词for
   运算/表达式

记忆卡 #2
带条件的列表推导式

[表达式 for 变量 in 列表 if 条件]

口诀："先for循环跑，if来过滤，
       符合条件的才做表达式"

单手"停"动作

记忆卡 #3
for vs 推导式 对照

# 普通写法（4行）
结果 = []
for x in [1,2,3]:
    结果.append(x*2)

# 推导式（1行）
结果 = [x*2 for x in [1,2,3]]

省了3行！
```

---

## 详细教学过程

---

### 第一阶段：导入（10分钟）

#### 0:00-2:00 —— 复习回顾

**教师活动**：
1. 在黑板左侧写下一段代码：

```python
# 大家还记得这个吗？
数字列表 = []
for i in range(1, 11):
    数字列表.append(i)
print(数字列表)
```

2. 提问："这段代码做了什么事？"
3. 请一位同学回答（生成1到10的数字列表）

**学生活动**：回忆上节课的for循环和列表操作

**过渡语**：
> 同学们都很棒！但是……你们不觉得这段代码有点啰嗦吗？
> 明明只是想要一个列表，却要写4行代码！
> 今天老师教大家一个"魔法"，把4行变成1行！

#### 2:00-5:00 —— 情境导入：压缩饼干的故事

**教师活动**：
1. 拿出准备好的压缩饼干（实物或图片）
2. 展示："这是什么？——压缩饼干！"
3. 讲小故事：
   > 战士们去野外行军，不能背一大包食物对吧？
   > 所以发明了压缩饼干！小小一块，泡水就变大！
   > Python里也有"压缩饼干"——叫**列表推导式**！
   > 它能把好几行代码"压缩"成一行！

**身体锚点示范**：
- 双手合拢（做压缩动作）→ "这是压缩！"
- 双手张开（做展开动作）→ "这是展开！"
- "大家一起做！压缩——展开——压缩——展开！"

**学生活动**：
- 跟着老师一起做"压缩—展开"动作
- 兴趣被调动，好奇心被激发

#### 5:00-8:00 —— 悬念展示

**教师活动**：
1. 在黑板右侧写下"魔法代码"：

```python
# 普通写法（4行）
数字列表 = []
for i in range(1, 11):
    数字列表.append(i)

# 魔法写法（1行）
数字列表 = [i for i in range(1, 11)]
```

2. 让学生对比左右两侧
3. "哇！从4行变成1行！是不是像压缩饼干？"

**学生活动**：
- 发出惊叹声
- 同桌之间讨论：真的能运行吗？

#### 8:00-10:00 —— 今天的学习目标

**教师活动**：
1. 用简单语言介绍本节课目标：
   - 学会"压缩饼干"魔法——列表推导式
   - 学会用"筛子"过滤——加if条件
   - 学会"双层压缩"——嵌套for循环
   - 用turtle画一幅漂亮的图画

2. 展示最终成品效果（提前运行好的turtle画面）

**学生活动**：
- 看到目标画面，产生期待
- 大声说"准备好了！"

**过渡语**：
> 好！现在我们来学习"压缩饼干"的配方！

---

### 第二阶段：知识点讲解（20分钟）

---

#### 知识点1：列表推导式的基本语法（6分钟）

##### 10:00-11:00 —— 配方展示

**教师活动**：
在黑板上写下"魔法配方"：

```
列表推导式 = 魔法压缩饼干

[  表达式  for  变量  in  列表  ]
   |        |     |      |
 要做的操作 循环变量  数据来源

读法：对列表中的每个变量做表达式
```

**身体锚点**：双手合拢做"压缩"动作

##### 11:00-13:00 —— 实例拆解

**教师活动**：
用黑板逐行拆解：

```python
# 第一关：复制数字（最简单！）
数字 = [i for i in range(1, 6)]
print(数字)  # 结果: [1, 2, 3, 4, 5]

# 拆解成for循环：
数字 = []
for i in range(1, 6):
    数字.append(i)
```

> 这里的 i 既当"变量"又当"表达式"——就是把 i 原封不动放进列表

```python
# 第二关：加工数字
翻倍 = [i * 2 for i in range(1, 6)]
print(翻倍)  # 结果: [2, 4, 6, 8, 10]

# 拆解成for循环：
翻倍 = []
for i in range(1, 6):
    翻倍.append(i * 2)
```

> 看！表达式从 i 变成了 i * 2，这就是"加工"！

**记忆钩子**："方括号里写公式，for字前面是表达式"

**学生活动**：
- 跟着老师在纸上写代码
- 同桌互相检查
- 齐声读口诀

##### 13:00-14:00 —— 互动：你能猜对吗？

**教师活动**：
在黑板出题：

```python
# 猜猜结果是什么？
结果 = [x + 10 for x in [5, 10, 15]]
print(结果)  # ???
```

请同学猜答案，然后运行验证

**学生活动**：举手猜答案：[15, 20, 25]

##### 14:00-15:00 —— 字符串也适用

```python
# 对字符串操作
名字 = ["小明", "小红", "小刚"]
欢迎 = [n + "同学" for n in 名字]
print(欢迎)  # ['小明同学', '小红同学', '小刚同学']
```

**身体锚点**：双手指向自己——"对列表里的每个名字，都加个同学"

##### 15:00-16:00 —— 小练习：填空

> 老师来考考大家！把下面for循环改成列表推导式：

```python
# for循环写法（4行）
平方数 = []
for n in range(1, 6):
    平方数.append(n ** 2)

# 列表推导式（1行）
平方数 = [n ** 2 for n in range(1, 6)]
```

**学生活动**：口答完成填空

---

#### 知识点2：带条件的列表推导式（6分钟）

##### 16:00-17:00 —— 筛子的比喻

**教师活动**：
> 有时候我们不想要全部数据，只想要符合条件的——怎么办？
> 就像用筛子筛沙子！大石头留下，细沙漏下去！
> 在列表推导式里，**if** 就是我们的筛子！

写公式：

```
[表达式 for 变量 in 列表 if 条件]
                            |
                        "筛子"——只让符合条件的通过
```

**身体锚点**：单手做"停"的动作——"if 一挡，不符合条件的都停下！"

##### 17:00-19:00 —— 实例讲解

**示例1：筛出偶数**

```python
# 从1到10中挑出偶数
偶数 = [i for i in range(1, 11) if i % 2 == 0]
print(偶数)  # [2, 4, 6, 8, 10]

# 拆解成for循环：
偶数 = []
for i in range(1, 11):
    if i % 2 == 0:
        偶数.append(i)
```

> if i % 2 == 0 就是筛子——只有除以2余数为0的数（偶数）能通过！

**示例2：加工过滤后的数据**

```python
# 筛出偶数，然后每个翻倍
翻倍偶数 = [i * 2 for i in range(1, 11) if i % 2 == 0]
print(翻倍偶数)  # [4, 8, 12, 16, 20]

# 拆解：
翻倍偶数 = []
for i in range(1, 11):
    if i % 2 == 0:
        翻倍偶数.append(i * 2)
```

> 注意顺序！先for循环过滤，再对过滤后的结果做表达式！
> 可以记为：for跑→if筛→表达式加工

**示例3：字符串过滤**

```python
# 名字里选长度大于2的
同学 = ["小明", "张伟", "李小美", "王"]
长名字 = [n for n in 同学 if len(n) > 2]
print(长名字)  # ['李小美']
```

**记忆钩子**："for画图if过滤，一句生成新列表"

**学生活动**：
- 跟着老师在纸上写if过滤条件
- 一起读口诀："for跑→if筛→表达式加工"

##### 19:00-20:00 —— 身体游戏

**教师活动**：
组织全班做"数据过滤器"游戏：
1. 老师说出一个数字
2. 如果是偶数，同学们拍手（通过）
3. 如果是奇数，同学们不做声（被过滤）
4. 配合口诀："for循环跑跑跑，if筛子滤滤滤"

**学生活动**：全身参与，在游戏中理解过滤概念

##### 20:00-22:00 —— 互动练习

**教师提问**：
```python
# 从10到20中，选出能被3整除的数
结果 = [i for i in range(10, 21) if i % 3 == 0]
# 结果会是什么？
```

**学生活动**：
- 举手回答：[12, 15, 18]
- 到黑板前写出for循环版本

---

#### 知识点3：嵌套for循环的列表推导式（5分钟）

##### 22:00-23:00 —— 双循环的引入

**教师活动**：
> 有时候一个循环不够用！比如——要做一个九九乘法表，需要一个数一个数地跟所有数搭配。
> 这就用到**嵌套循环**，也叫"双层压缩"

**身体锚点**：双手画圈——"一层循环画一个圈，两层循环画两个圈"

```python
# 普通嵌套循环
坐标 = []
for x in range(3):
    for y in range(3):
        坐标.append((x, y))
print(坐标)
# [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2), (2,0), (2,1), (2,2)]

# 列表推导式（一行！）
坐标 = [(x, y) for x in range(3) for y in range(3)]
print(坐标)
# 同样的结果！
```

##### 23:00-24:00 —— 拆解说明

**教师活动**：
在黑板上画出图解：

```
[(x, y) for x in range(3) for y in range(3)]
              |                    |
            外循环              内循环
       （x先变，变3次）    （y后变，变9次）

执行顺序：
x=0 -> y=0, y=1, y=2  ->  (0,0)(0,1)(0,2)
x=1 -> y=0, y=1, y=2  ->  (1,0)(1,1)(1,2)
x=2 -> y=0, y=1, y=2  ->  (2,0)(2,1)(2,2)
```

> x变一次，y跑一圈！x变3次，y跑3圈共9次！

**记忆钩子**："想要多层怎么办？for字再写一个for"

##### 24:00-25:00 —— 实例：扁平化列表

```python
# 把二维列表[[1,2],[3,4],[5,6]] 变成 [1,2,3,4,5,6]
矩阵 = [[1, 2], [3, 4], [5, 6]]
展开 = [i for 行 in 矩阵 for i in 行]
print(展开)  # [1, 2, 3, 4, 5, 6]

# 拆解：
展开 = []
for 行 in 矩阵:
    for i in 行:
        展开.append(i)
```

> 这个技巧叫"展平"——把嵌套列表变成一层列表！

##### 25:00-27:00 —— 带条件的嵌套

```python
# 生成坐标，但x和y不能相等（去掉对角线）
坐标 = [(x, y) for x in range(3) for y in range(3) if x != y]
print(坐标)
# [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)]
```

> 先两层循环跑完所有组合，再用if筛掉不合格的！

**学生活动**：
- 在纸上写：生成所有(x,y)坐标，x从0到2，y从0到2
- 然后加if条件去掉x==y的组合

---

#### 知识点4：列表推导式 + turtle（3分钟）

##### 27:00-28:00 —— 生成坐标列表

**教师活动**：
> 学会了列表推导式，做turtle图形就方便了！
> 以前我们要手动写坐标，现在可以让Python自动生成！

```python
import turtle

t = turtle.Turtle()
t.speed(5)

# 用列表推导式生成坐标点
坐标点 = [(x * 50, y * 50) for x in range(-3, 4) for y in range(-3, 4)]
# 这会产生从(-150,-150)到(150,150)的49个点！

# 或者：生成一个圆圈上的点
import math
角度 = range(0, 360, 30)  # 每30度一个点
圆上点 = [(100 * math.cos(math.radians(a)), 100 * math.sin(math.radians(a))) for a in 角度]
```

##### 28:00-29:00 —— 生成颜色列表

```python
# 用列表推导式生成渐变色
颜色列表 = [(r/10, 0, 1-r/10) for r in range(10)]
# 从蓝色渐变到红色！
```

##### 29:00-30:00 —— 综合示例预览

```python
# 生成一排不同颜色的小海龟
for i, 颜色 in enumerate(["red", "orange", "yellow", "green", "blue"]):
    t = turtle.Turtle()
    t.color(颜色)
    t.penup()
    t.goto(i * 50 - 100, 0)
    t.pendown()
    t.circle(20)
```

**过渡语**：
> 好啦！理论学完了！现在老师给大家演示——用列表推导式画出漂亮的图案！

---

### 第三阶段：演示（10分钟）

---

#### 30:00-33:00 —— 演示1：星空点点

**教师活动**：
运行第一个演示程序，让学生观察效果

```python
import turtle
import random

t = turtle.Turtle()
t.speed(0)
turtle.bgcolor("black")

# 用列表推导式生成100个随机坐标
星星坐标 = [(random.randint(-300, 300), random.randint(-300, 300)) for _ in range(100)]
# 用列表推导式生成随机颜色
星星颜色 = [(random.random(), random.random(), random.random()) for _ in range(100)]
# 用列表推导式生成随机大小
星星大小 = [random.randint(5, 15) for _ in range(100)]

# 画星星
for i in range(100):
    t.penup()
    t.goto(星星坐标[i][0], 星星坐标[i][1])
    t.color(星星颜色[i])
    t.pendown()
    t.dot(星星大小[i])

t.hideturtle()
```

> 看！列表推导式一次性生成了100个坐标、100种颜色、100个大小！
> 如果用手写，要写到什么时候？

**学生活动**：
- 观看演示，发出惊叹
- 观察代码结构，理解列表推导式的作用

**教师引导**：
> 同学们注意看三行推导式——它们分别生成了什么？

#### 33:00-36:00 —— 演示2：彩色螺旋

**教师活动**：

```python
import turtle
import math

t = turtle.Turtle()
t.speed(0)
t.width(2)

# 用列表推导式生成螺旋的坐标
螺旋点 = [(20 * a * math.cos(math.radians(a)), 20 * a * math.sin(math.radians(a))) for a in range(0, 360, 5)]

# 用列表推导式生成渐变色
颜色 = [((a / 360) % 1, 0.5, 1 - (a / 360) % 1) for a in range(0, 360, 5)]

# 画螺旋
for i in range(len(螺旋点)):
    t.color(颜色[i])
    t.goto(螺旋点[i][0], 螺旋点[i][1])

t.hideturtle()
```

> 这个螺旋越来越大，颜色也在渐变！
> 推导式里 a 从0到355，每次加5，角度越来越大，螺旋就展开了！

#### 36:00-38:00 —— 演示3：棋盘格

**教师活动**：

```python
import turtle

t = turtle.Turtle()
t.speed(0)

# 用列表推导式生成所有棋盘格子坐标（嵌套推导式）
格子 = [(x * 40, y * 40) for x in range(-4, 4) for y in range(-4, 4)]

# 用列表推导式判断奇偶来决定颜色
颜色表 = [("white" if (x + y) % 2 == 0 else "black") for x in range(8) for y in range(8)]

# 画棋盘
for i in range(len(格子)):
    t.penup()
    t.goto(格子[i][0], 格子[i][1])
    t.fillcolor(颜色表[i])
    t.pendown()
    t.begin_fill()
    for _ in range(4):
        t.forward(40)
        t.right(90)
    t.end_fill()

t.hideturtle()
```

> 注意颜色表那行：if条件在推导式里，根据(x+y)的奇偶决定填什么颜色！
> 这就是"for跑 if筛 表达式加工"的完整应用！

#### 38:00-40:00 —— 代码对照讲解

**教师活动**：
把黑板分成两半：
- 左边：普通for循环写法（6-8行）
- 右边：列表推导式写法（1-2行）

> 看到了吗？左边要写这么多，右边只要一行！
> 这就是列表推导式的威力！

**学生活动**：
- 对比左右两边
- 齐声说口诀："for画图if过滤，一句生成新列表！"
- 做"压缩"动作（双手合拢）

---

### 第四阶段：实操（15分钟）

---

#### 练习1（3分钟）：填空——补全颜色渐变

**要求**：补全列表推导式，生成从红色渐变到蓝色的颜色列表

```python
import turtle

t = turtle.Turtle()
t.speed(5)

# TODO: 用列表推导式生成10个颜色
# RGB值从 (1, 0, 0) 到 (0, 0, 1) 渐变
颜色列表 = [(1 - i/10, 0, i/10) for i in range(10)]

# 画一排彩色圆点
for i in range(10):
    t.color(颜色列表[i])
    t.penup()
    t.goto(i * 30 - 150, 0)
    t.pendown()
    t.dot(25)

t.hideturtle()
```

**参考答案**：
```python
颜色列表 = [(1 - i/10, 0, i/10) for i in range(10)]
```

**学生活动**：
- 补全推导式中的表达式部分
- 运行看效果

**教师巡视**：检查学生是否理解i/10的渐变原理

---

#### 练习2（3分钟）：填空——补全过滤条件

**要求**：补全列表推导式，只画半径大于15的圆

```python
import turtle

t = turtle.Turtle()
t.speed(5)

半径列表 = [5, 12, 18, 25, 8, 30, 3, 20]

# TODO: 用列表推导式过滤出半径大于15的
大半径 = [r for r in 半径列表 if r > 15]

颜色 = ["red", "blue", "green", "orange", "purple", "pink", "yellow", "cyan"]

for i, r in enumerate(大半径):
    t.color(颜色[i % len(颜色)])
    t.penup()
    t.goto(i * 60 - 200, 0)
    t.pendown()
    t.circle(r)

t.hideturtle()
```

**参考答案**：
```python
大半径 = [r for r in 半径列表 if r > 15]
```

**学生活动**：
- 补全if条件部分
- 运行验证：只有18, 25, 30, 20的圆被画出

---

#### 练习3（4分钟）：仿写——生成坐标连线

**要求**：用列表推导式生成八边形顶点坐标，让turtle连线画出八边形

```python
import turtle
import math

t = turtle.Turtle()
t.speed(3)

# 提示：
# 1. 用range(0, 360, 45)生成8个角度
# 2. 用列表推导式生成每个角度对应的坐标
#     x = 半径 * cos(角度弧度)
#     y = 半径 * sin(角度弧度)
# 3. 坐标格式：(x, y)
# 4. 让turtle在这些点之间连线

半径 = 100
# 补全列表推导式
坐标点 = [(半径 * math.cos(math.radians(a)), 半径 * math.sin(math.radians(a))) for a in range(0, 360, 45)]

# 画图
t.penup()
t.goto(坐标点[0])  # 移动到第一个点
t.pendown()
for 点 in 坐标点[1:]:  # 剩下的点连线
    t.goto(点)
t.goto(坐标点[0])  # 回到起点闭合图形

t.hideturtle()
```

**参考输出**：一个正八边形

**额外挑战**：用嵌套列表推导式生成多个同心八边形（多个半径）

```python
# 挑战版
所有坐标 = [(r, a) for r in [50, 80, 120] for a in range(0, 360, 45)]
# 生成三个八边形的所有顶点
```

**学生活动**：
- 先写出单层推导式
- 运行看到八边形
- 有能力的学生尝试挑战版

**教师巡视**：
- 帮助不会的同学
- 提示：math.cos和math.sin需要使用弧度，用math.radians转换

---

#### 练习4（5分钟）：创作——画彩虹

**要求**：用列表推导式生成彩虹的7种颜色和7个弧线位置

```python
import turtle

t = turtle.Turtle()
t.speed(0)
t.width(5)

# 提示：
# 1. 彩虹7种颜色：红橙黄绿蓝靛紫
# 2. 用列表推导式生成颜色序列
# 3. 用列表推导式生成每个弧线的y坐标偏移
# 4. 从外到内画7个半圆

彩虹颜色 = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"]

# 用列表推导式生成每个弧线向上偏移的量
# 最外层偏移0，每层向内缩20
偏移量 = [i * 20 for i in range(7)]

# 用列表推导式生成每个弧线的半径
# 从200开始，每层减20
半径列表 = [200 - i * 20 for i in range(7)]

# 画彩虹
t.penup()
t.goto(-200, -100)
t.pendown()

for i in range(7):
    t.color(彩虹颜色[i])
    # 每层画一个半圆
    t.setheading(0)
    t.penup()
    t.goto(-半径列表[i], -100 + 偏移量[i])
    t.setheading(90)
    t.pendown()
    t.circle(半径列表[i], 180)

t.hideturtle()
```

**学生活动**：
- 独立完成推导式的编写
- 调试运行
- 调整颜色和位置参数

**创作加分**：
- 加上云朵、太阳等装饰
- 改变线条粗细，让彩虹更好看
- 在彩虹下面加一行花朵

---

### 第五阶段：小测（5分钟）

---

#### 小测题目（投影展示）

**第1题（选择）**：列表推导式的外面用什么括号？
- A. 小括号 ()
- B. 中括号 []
- C. 大括号 {}

**第2题（填空）**：补全代码，生成0到9的平方数列表
```python
平方 = [i ** 2 __ i __ range(10)]
# 答案：for, in
```

**第3题（判断）**：下面代码能选出偶数吗？
```python
结果 = [i for i in range(10) if i % 2 == 0]
```
- A. 能
- B. 不能

**第4题（选择）**：`[x*y for x in range(3) for y in range(3)]` 会生成几个数？
- A. 3
- B. 6
- C. 9

**第5题（简答）**：用自己的话说说"列表推导式"是什么？

**参考答案**：
- 学生应答：用一行代码生成列表的方法
- 能用"压缩饼干"比喻更好

#### 评分方式
- 全对：星星贴纸 x3
- 对3-4题：星星贴纸 x2
- 对1-2题：星星贴纸 x1

---

## 教学提示

### 常见困难与应对

| 学生困难 | 表现 | 应对策略 |
|---------|------|---------|
| 不理解表达式部分 | 只会写`[i for i in ...]` | 用实物演示：苹果到切块（表达式就是对元素做加工） |
| if位置写错 | 把if写在for前面 | 口诀："for画图if过滤"——if一定在for后面 |
| 嵌套顺序混淆 | 内外循环搞反 | 用双色粉笔，外循环用一种颜色，内循环用另一种 |
| 忘记加中括号 | 写成`i for i in range(10)` | 重复："列表推导式要有'房子'——中括号！" |
| 变量名重复 | 内外循环用同一变量 | 用不同字母，x和y最容易区分 |

### 课堂节奏控制

- 如果学生接受快：多讲嵌套推导式和turtle综合应用
- 如果学生感到吃力：重点把基本语法和if条件练熟，嵌套可略讲
- 每个知识点后立即练习，不要一次性讲完所有内容
- 发现学生注意力下降时，立即做身体锚点动作（站起来做"压缩—展开"）

### 差异化教学

- **基础组**：只要求掌握 `[expr for var in list]` 基本语法和if条件
- **进阶层**：要求掌握嵌套for循环、turtle综合应用
- **挑战组**：要求用列表推导式生成更复杂的图案（如雪花分形、曼陀罗）

### 安全教育提醒

- 提醒学生不要盯着turtle画图窗口看太久
- 定时让眼睛休息（看远处）
- 保持正确坐姿

---

## 课程复盘

### 教师课后自评问题

1. 学生对"压缩饼干"比喻的理解程度如何？
2. 身体锚点（压缩—展开）是否有效帮助学生记忆？
3. turtle演示是否激发了学生的兴趣？
4. 实操环节时间是否充足？
5. 小测结果显示学生薄弱点在哪里？

### 记录学生表现

| 学生姓名 | 理解程度 | 实操完成度 | 小测得分 | 备注 |
|---------|---------|-----------|---------|------|

---

## 课后延展

### 趣味挑战（选做）
1. 用列表推导式生成斐波那契数列的前20项（提示：需要配合循环）
2. 用列表推导式生成"蛇形"坐标，让turtle走出S形路径
3. 用嵌套列表推导式做一个5x5的彩色方格，每个格子颜色不同

### 家庭互动
- 教爸爸妈妈什么是"列表推导式"
- 让爸爸妈妈猜：`[i*3 for i in range(1, 5)]` 的结果是什么

### 课外资源
- 推荐阅读：《Python编程：从入门到实践》第4章
- 在线练习：Codecademy Python列表推导式练习
- 视频资源：B站搜索"少儿Python列表推导式"

---

## 课程亮点总结

```
本课核心收获

列表推导式 = 一行代码生成列表
基本语法：[表达式 for 变量 in 列表]
带条件：[表达式 for 变量 in 列表 if 条件]
嵌套推导：[表达式 for x in ... for y in ...]
turtle应用：生成坐标、颜色、大小等列表

记忆口诀
"for画图 if过滤，一句生成新列表"

身体锚点
双手合拢（压缩）-> 双手张开（展开）
单手做"停"（过滤）-> 双手画圈（嵌套）
```
