> **GESP等级：二级 | 考级考点：GESP Python 二级**

# 09 字符串 — 第13节：字符串索引、切片、拼接、重复

## 课程信息
- **课时安排**：1课时（60分钟）
- **教学重点**：字符串索引与切片、拼接与重复操作、字符串不可变性
- **记忆钩子**：字符串跟列表一样能索引切片拼接重复但不可变

---

## 教学流程

### 一、导入（00:00-10:00）——字符串也是序列！

| 环节 | 内容 | 时长 |
|------|------|------|
| 回顾列表 | "我们学过列表，列表可以通过下标取元素。其实字符串也是序列！" | 3min |
| 类比引出 | 展示 `name = "Python"`，问："能不能像列表一样用 `name[0]` 取第一个字符？" | 3min |
| 揭晓答案 | 当然可以！字符串和列表一样支持 **索引**、**切片**、**拼接**、**重复** | 4min |

**教师话术**：
> "列表能做的事，字符串大部分也能做。因为字符串本质上就是一个**由字符组成的不可变序列**。今天我们就来学字符串的索引、切片、拼接和重复。"

---

### 二、知识点讲解（10:00-30:00）

#### ① 字符串索引 `s[index]`

```python
s = "Python"
print(s[0])   # 'P'  正向索引
print(s[-1])  # 'n'  反向索引
```

- 正向索引：`0` 开始 → 从左到右
- 反向索引：`-1` 开始 → 从右到左
- **关键**：索引超出范围会报 `IndexError`

#### ② 字符串切片 `s[start:end:step]`

```python
s = "Python"
print(s[0:3])    # 'Pyt'  取索引 0,1,2（含头不含尾）
print(s[:])      # 'Python'  复制
print(s[::2])    # 'Pto'  步长为2
print(s[::-1])   # 'nohtyP'  反转
```

- **含头不含尾**：`s[0:3]` 取索引 0,1,2，不包括 3
- 省略 `start` 默认从开头
- 省略 `end` 默认到结尾
- **反向切片**：`s[::-1]` 经典反转写法

#### ③ 字符串拼接 `s1 + s2`

```python
s1 = "Hello"
s2 = "World"
print(s1 + " " + s2)   # 'Hello World'
```

- 用 `+` 将多个字符串连成一个新字符串
- **注意**：不同类型不能拼接（字符串+数字会报错）

#### ④ 字符串重复 `s * n`

```python
print("*" * 10)   # '**********'
print("Ha" * 3)   # 'HaHaHa'
```

- 适用于快速生成重复字符/图案

#### ⑤ 字符串不可变

```python
s = "Python"
s[0] = "J"   # TypeError: 'str' object does not support item assignment
```

- 字符串一旦创建，**不能修改其中的字符**
- 要修改只能创建新字符串：`s = "J" + s[1:]` → `'Jython'`

---

### 三、演示环节（30:00-40:00）

教师逐行运行以下代码并讲解：

```python
# 演示1：索引
name = "Python"
print("第一个字符：", name[0])       # P
print("最后一个字符：", name[-1])    # n
print("第二个字符：", name[1])       # y

# 演示2：切片
print("前三个字符：", name[0:3])     # Pyt
print("第2到第4个字符：", name[1:4]) # yth
print("反转：", name[::-1])          # nohtyP

# 演示3：拼接
print("Hello " + "World")           # Hello World
greeting = "你好" + "，" + "Python"
print(greeting)                      # 你好，Python

# 演示4：重复
print("*" * 20)                     # **************
print("Go! " * 3)                   # Go! Go! Go!

# 演示5：不可变（故意报错）
try:
    name[0] = "J"
except TypeError as e:
    print("报错了！字符串不可变：", e)
```

---

### 四、实操练习（40:00-55:00）

三道题，学生独立完成，教师巡视指导。

| 题号 | 类型 | 内容 | 分值 |
|------|------|------|------|
| 1 | 填空 | 索引结果填空 | 40分 |
| 2 | 编码 | 切片字符串提取信息 | 30分 |
| 3 | 编码 | `"*" * n` 画字符画 | 30分 |

详细题目见 `03_实操练习.py`

---

### 五、课堂小测（55:00-60:00）

快速问答（2题），检测当堂掌握情况：

1. `'Python'[0:3]` 的输出结果是？
2. `"A" * 5` 的输出结果是？

详细题目见 `04_小测.py`

---

## 板书设计

```
字符串索引切片拼接重复
├── 索引: s[0], s[-1]
├── 切片: s[0:3], s[::-1]
├── 拼接: s1 + s2
├── 重复: s * n
└── 不可变: s[0]="x" ❌

记忆钩子: 字符串跟列表一样能索引切片拼接重复但不可变
```

---

## 课后作业
1. 定义一个字符串 `s = "Hello, Python!"`，用切片取出 `"Python"`
2. 用 `"*"` 和 `"-"` 拼接重复，打印一个 5x5 的网格图案
3. 尝试 `"123" + 456`，观察报错信息并解释原因
