> **GESP等级：二级 | 考级考点：GESP Python 二级**

# 第15节 列表基础 · 创建+索引+遍历
**课时：** 1课时（约60分钟）
**目标学生：** 已掌握变量、for循环基础
**GESP考点：** #23 列表创建与索引、#24 列表遍历

---

## 教学目标

1. **理解列表的概念**：列表是一排带编号的容器，可以存储多个数据
2. **掌握列表的创建**：用方括号 `[]` 创建列表，元素用逗号分隔
3. **掌握正索引和负索引**：索引从0开始，`-1` 表示最后一个元素
4. **掌握for循环遍历列表**：`for 变量 in 列表:` 逐个取出元素
5. **能应用列表解决实际问题**：用颜色列表+for循环+ turtle 画彩虹圆

---

## 教学重难点

| 类型 | 内容 |
|------|------|
| 重点 | 列表的创建语法、正索引从0开始、for循环遍历 |
| 难点 | 索引从0开始（学生容易从1开始数）、负索引的理解 |
| 易错点 | 索引越界（IndexError）、忘记方括号、遍历时修改列表 |

---

## 教学过程

### 第一部分：导入——一排编号盒子 = 列表（00:00-10:00）

**故事引入：**

> 想象你面前有一个盒子架，上面有3个盒子——
> 第1个盒子装"red"，第2个盒子装"blue"，第3个盒子装"green"。
>
> 如果用普通变量，你要写3行：
> ```python
> color1 = "red"
> color2 = "blue"
> color3 = "green"
> ```
> 但如果要装100种颜色呢？写100个变量太麻烦！
>
> 于是 Python 给了我们一个"魔法架子"——**列表（list）**。
> 一个列表就能装所有颜色！

**板书图示：**

```
┌─────┬──────┬───────┐
│ red │ blue │ green │
├─────┼──────┼───────┤
│ [0] │ [1]  │  [2]  │  ← 编号（索引）从0开始
└─────┴──────┴───────┘
```

**引导提问：**
- 为什么索引从0开始，而不是1？（计算机从0计数是惯例，也是Python的设计哲学）
- 如果列表有10个元素，最后一个索引是几？（9，即 len-1）

**记忆钩子引入：**
> **"列表 = 一排贴编号盒子，编号从0开始"**
> **"方盒子用方括号 []"**

---

### 第二部分：知识点讲解（10:00-30:00）

#### ① 创建列表

```python
# 基本语法
列表名 = [元素1, 元素2, 元素3, ...]

# 示例
colors = ["red", "blue", "green"]    # 字符串列表
numbers = [10, 20, 30, 40, 50]       # 整数列表
mix = ["hello", 100, True, 3.14]     # 混合类型列表
```

**要点：**
- 用方括号 `[]` 括起来，元素之间用逗号 `,` 分隔
- 列表可以装不同类型的数据（字符串、整数、布尔值等）
- 列表是有序的——元素的顺序就是存入的顺序

#### ② 正索引（从0开始）

```python
colors = ["red", "blue", "green", "yellow", "purple"]
# 索引:     [0]     [1]     [2]      [3]       [4]

print(colors[0])   # "red"    ← 第一个元素
print(colors[2])   # "green"  ← 第三个元素
print(colors[4])   # "purple" ← 最后一个元素（索引 = len-1）
```

**索引规则：**
- 第一个元素索引是 **0**，不是1！
- 最后一个元素索引是 `len(列表) - 1`
- 可以通过 `列表[索引] = 新值` 修改元素

**常见错误：** `IndexError: list index out of range` — 索引超出范围！

#### ③ 负索引（-1是最后一个）

```python
colors = ["red", "blue", "green", "yellow", "purple"]
# 正索引: [0]    [1]     [2]      [3]       [4]
# 负索引: [-5]   [-4]    [-3]     [-2]      [-1]

print(colors[-1])   # "purple"  ← 最后一个元素
print(colors[-2])   # "yellow"  ← 倒数第二个
print(colors[-3])   # "green"   ← 倒数第三个
```

**什么时候用负索引？**
- 想取最后一个元素但不知道列表长度 → `colors[-1]`
- 想取倒数第几个 → `colors[-2]`, `colors[-3]`
- 比 `colors[len(colors)-1]` 更简洁

#### ④ for循环遍历列表

```python
# 方式一：直接遍历元素（推荐）
colors = ["red", "blue", "green"]
for c in colors:
    print(c)

# 方式二：通过索引遍历
for i in range(len(colors)):
    print(f"colors[{i}] = {colors[i]}")

# 方式三：enumerate 同时拿到索引和元素
for i, c in enumerate(colors):
    print(f"{i}: {c}")
```

**三种方式对比：**

| 方式 | 适用场景 | 代码 |
|:----:|---------|------|
| 直接遍历 | 只需要元素值 | `for c in colors:` |
| 索引遍历 | 需要修改元素或关注位置 | `for i in range(len(colors)):` |
| enumerate | 同时需要索引和元素 | `for i, c in enumerate(colors):` |

---

### 第三部分：演示——用颜色列表画彩虹圆（30:00-40:00）

讲师现场运行 `08第15节4_代码.py` 中的 `demo_rainbow_circles()`。

**演示流程：**

**第1步：3种颜色**
```python
colors = ["red", "blue", "green"]
for c in colors:
    t.color(c)
    t.circle(30)
```

**第2步：彩虹7色**
```python
rainbow = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"]
radius = 40
for color in rainbow:
    t.color(color)
    t.circle(radius)
    radius += 10  # 半径递增，彩虹效果
```

**关键观察点：**
- `for c in colors:` 每次循环从列表中取出一个颜色
- `t.color(c)` 把取出的颜色传给画笔
- 列表让数据组织更清晰，代码更简洁
- 如果不用列表，需要写3遍 t.color() + t.circle()

---

### 第四部分：实操练习（40:00-55:00）

**练习1：填空索引（10分钟）**

```python
fruits = ["apple", "banana", "cherry", "durian"]
# ① 取出 "apple"     →  fruits[____]
# ② 取出 "cherry"    →  fruits[____]
# ③ 取出 "durian"    →  fruits[____] 或 fruits[____]
```

**练习2：补全遍历代码（10分钟）**

```python
pets = ["cat", "dog", "fish"]
# 补全代码，遍历 pets 列表并输出每个元素
____ p ____ pets:
    ____(p)
```

**练习3：用颜色列表画彩虹圆（15分钟）**

使用 `colors = ["red", "orange", "yellow", "green", "blue"]`，遍历列表并用 turtle 画出5个不同颜色的圆。

提示：
- 每个圆用 `t.circle(25)` 画
- 画完一个用 `t.penup()` + `t.forward(60)` + `t.pendown()` 移动位置

**参考答案：** 见 `08第15节4_代码.py` 中的 `practice_answers()`

---

### 第五部分：小测与总结（55:00-60:00）

**小测题目：**

1. `colors = ["red", "blue", "green", "yellow", "purple"]`
   - `colors[0]` 是什么？
   - `colors[-1]` 是什么？

2. 下面哪个索引会报错？
   - A. `colors[0]`
   - B. `colors[4]`
   - C. `colors[5]`    ← 索引越界！
   - D. `colors[-1]`

3. 补全代码，遍历 `nums = [10, 20, 30]` 并输出每个数的两倍：
   ```python
   nums = [10, 20, 30]
   for n ____ nums:
       print(____)
   ```

4. 判断对错：列表的索引从1开始。（ 错，从0开始 ）

**记忆钩子：**
> **"列表 = 一排贴编号盒子，编号从0开始"**
> **"方盒子用方括号 []"**
> **"正索引 0 1 2 3...，负索引 -1最后一个 -2倒数第二个..."**

---

## 板书设计

```
┌───────────────────────────────────────────────┐
│  第15节 列表基础                                 │
│                                               │
│  列表 = 一排贴编号盒子                          │
│  colors = ["red", "blue", "green"]            │
│                                               │
│  ┌─────┬──────┬───────┐                       │
│  │ red │ blue │ green │                       │
│  ├─────┼──────┼───────┤                       │
│  │ [0] │ [1]  │  [2]  │  ← 从0开始！          │
│  │[-3] │ [-2] │  [-1] │  ← 负索引             │
│  └─────┴──────┴───────┘                       │
│                                               │
│  遍历：for c in colors:                        │
│            print(c)                            │
│                                               │
│  记忆：方盒子方括号 []  编号从0开始            │
└───────────────────────────────────────────────┘
```

---

## 课后反思

- 学生对"索引从0开始"是否理解到位？是否出现索引越界错误？
- 负索引的概念是否需要更多图示来辅助？
- for循环遍历列表是否与之前学的 for range 循环混淆？
- 彩虹圆演示是否激起了学生的兴趣？
