> **GESP等级：三级 | 考级考点：GESP Python 三级**

# 第06节 集合运算——交集 & / 并集 | / 差集 -
**课时：** 1课时（约60分钟）
**目标学生：** 已掌握集合的基本操作（第06节）
**GESP考点：** #33（集合运算）、#34（集合推导与成员检测）

---

## 教学目标

1. **理解集合运算的含义**：用"共同好友"的类比理解交集、并集、差集
2. **掌握 `&` 交集运算**：取两个集合「都有」的元素，相当于"且"的关系
3. **掌握 `|` 并集运算**：取两个集合「所有」元素（去重），相当于"或"的关系
4. **掌握 `-` 差集运算**：取「A有B没有」的元素，注意方向性
5. **能区分三种运算的适用场景**：根据实际问题选择合适的运算
6. **能运用集合运算解决颜色筛选、数据对比等实际问题**

---

## 教学重难点

| 类型 | 内容 |
|------|------|
| 重点 | `&` 交集取共同、`\|` 并集合并、`-` 差集取独有 |
| 难点 | 差集的**方向性**（A-B 与 B-A 结果不同）、三种运算的对比区分 |
| 易错点 | 混淆 `&` 和 `\|`、忘记差集方向、空集结果的处理 |

---

## 教学过程

### 第一部分：导入——两个班的颜色喜好，找共同喜欢的颜色（00:00-10:00）

**场景引入：**

> A班喜欢的颜色：红色、蓝色、绿色
> B班喜欢的颜色：蓝色、黄色、绿色
>
> 问题：两个班都喜欢哪些颜色？

**引导提问：**
- 两个班都喜欢 → 就是两个班的「交集」
- 两个班所有颜色合在一起 → 就是两个班的「并集」
- A班有但B班没有 → 就是两个班的「差集」

**生活类比：**

> **交集 &** = 朋友圈的「共同好友」——两边都有才算
> **并集 |** = 两班合班上大课——所有人都在，重复的只算一次
> **差集 -** = 「我独有的」——我有你没有

**用集合表示：**
```python
class_a = {"红色", "蓝色", "绿色"}
class_b = {"蓝色", "黄色", "绿色"}
print(class_a & class_b)  # {"蓝色", "绿色"}   ← 两个班都喜欢
print(class_a | class_b)  # {"红色", "蓝色", "绿色", "黄色"}  ← 全合在一起
print(class_a - class_b)  # {"红色"}  ← A班有，B班没有
```

**记忆钩子引入：**
> **"交集取出共同点，并集合成一大片，差集方向要分辨"**

---

### 第二部分：知识点讲解（10:00-30:00）

#### ① `s1 & s2` —— 交集：取「都有」的元素

```python
s1 = {"red", "blue"}
s2 = {"blue", "green"}
print(s1 & s2)  # {"blue"}  ← blue 在两边都有
```

**要点：**
- `&` 运算符，取两个集合中**共同存在**的元素
- 相当于数学中的「交集 ∩」
- 没有共同元素时，结果是空集 `set()`
- 记忆：`&` 像一张网，只兜住两边都有的

#### ② `s1 | s2` —— 并集：取「所有」元素（去重）

```python
s1 = {"red", "blue"}
s2 = {"blue", "green"}
print(s1 | s2)  # {"red", "blue", "green"}  ← 重复的 blue 只算一次
```

**要点：**
- `|` 运算符，合并两个集合的全部元素
- 自动**去重**——重复元素只保留一份
- 相当于数学中的「并集 ∪」
- 记忆：`|` 像两杯水倒进一个杯子，合体了

#### ③ `s1 - s2` —— 差集：取「A有B没有」的元素

```python
s1 = {"red", "blue"}
s2 = {"blue", "green"}
print(s1 - s2)  # {"red"}  ← s1 有 red，s2 没有 red
print(s2 - s1)  # {"green"}  ← s2 有 green，s1 没有 green
```

**要点：**
- `-` 运算符，从 A 中去掉也在 B 中的元素
- **方向很重要！** `A - B ≠ B - A`
- 相当于数学中的「差集 \」
- 记忆：`-` 像减法，减掉对方也有的，剩自己的

#### ④ 三种运算对比

| 运算 | 符号 | 含义 | 数学符号 | 结果特点 |
|:----:|:----:|:----:|:--------:|:--------:|
| 交集 | `&` | 两边都有 | ∩ | 变小或不变 |
| 并集 | `\|` | 全部合并 | ∪ | 变大或不变 |
| 差集 | `-` | A有B没有 | \ | 有方向性 |

**常见错误：**
- 集合运算只能用 `set` 类型，不能对 `list` 直接用 `&`、`|`、`-`
- 差集方向搞反——先想清楚"谁减谁"
- 空集写法是 `set()`，不是 `{}`（`{}` 是空字典）

---

### 第三部分：演示——集合运算三连击（30:00-40:00）

讲师现场运行 `10第06节4_代码.py` 的演示部分。

**演示流程：**

**第1步：基础集合运算**
```python
s1 = {"red", "blue"}
s2 = {"blue", "green"}

print(s1 & s2)  # {"blue"}       交集
print(s1 | s2)  # {"red", "blue", "green"}  并集
print(s1 - s2)  # {"red"}        差集
print(s2 - s1)  # {"green"}      反向差集
```

**关键观察点：**
- `s1 & s2` 结果只有 `blue` —— 两边都有的元素
- `s1 | s2` 结果有 3 个元素 —— 全部合在一起，重复的只算一次
- `s1 - s2` 和 `s2 - s1` 结果不同 —— 差集有方向性！

**第2步：数字集合演示**
```python
a = {1, 2, 3, 4, 5}
b = {4, 5, 6, 7, 8}

print(a & b)  # {4, 5}
print(a | b)  # {1, 2, 3, 4, 5, 6, 7, 8}
print(a - b)  # {1, 2, 3}
print(b - a)  # {6, 7, 8}
```

**关键观察点：**
- 数字集合的运算逻辑和字符串集合完全一样
- 并集结果按排序展示更方便观察

**第3步：颜色交集应用**
```python
paint_a = {"红", "蓝", "紫"}
paint_b = {"蓝", "绿", "黄"}

print(paint_a & paint_b)  # {"蓝"}  ← 共同颜料
print(paint_a | paint_b)  # {"红", "蓝", "紫", "绿", "黄"}  ← 所有颜料
print(paint_a - paint_b)  # {"红", "紫"}  ← 画家独有
print(paint_b - paint_a)  # {"绿", "黄"}  ← 同学独有
```

---

### 第四部分：实操练习（40:00-55:00）

**练习1：填空选择运算符号（10分钟）**

给出一组集合和结果，让学生判断用的是 `&`、`|` 还是 `-`。

```python
A = {"苹果", "香蕉", "橘子"}
B = {"香蕉", "橘子", "西瓜"}

# A _ B = {"苹果"}            ← 差集 -
# A _ B = {"苹果", "香蕉", "橘子", "西瓜"}  ← 并集 |
# A _ B = {"香蕉", "橘子"}    ← 交集 &
```

**练习2：心算集合运算结果（10分钟）**

```python
# 题目1：{"a", "b", "c"} & {"b", "c", "d"} = ?
# 题目2：{1, 2, 3} | {4, 5, 6} = ?
# 题目3：{10, 20, 30, 40} - {30, 40, 50} = ?
```

让学生先心算，再运行代码核对。

**练习3：用集合运算找共同颜色（15分钟）**

三个小朋友的积木颜色：
- 小明：`{"红", "黄", "蓝", "绿"}`
- 小红：`{"蓝", "绿", "紫", "橙"}`
- 小刚：`{"绿", "橙", "粉", "红"}`

问题：
1. 小明和小红有哪些共同颜色？（交集）
2. 三人所有积木合在一起有哪些颜色？（并集）
3. 小明有但小红没有的颜色？（差集）
4. 三个小朋友都有的颜色？（多重交集 `&` 连用）

**参考答案：** 见 `10第06节4_代码.py` 实操部分

---

### 第五部分：小测与总结（55:00-60:00）

**小测题目：**

1. `{1, 2, 3} & {2, 3, 4}` 的结果是？
   - A. `{1, 2, 3, 4}`
   - B. `{2, 3}`   ← 正确答案
   - C. `{1, 4}`
   - D. `{1, 2, 3}`

2. `{'a', 'b'} | {'b', 'c'}` 的结果是？
   - A. `{'a', 'b', 'c'}`   ← 正确答案
   - B. `{'b'}`
   - C. `{'a', 'b', 'b', 'c'}`
   - D. `{'a', 'c'}`

3. `{5, 6, 7, 8} - {7, 8, 9}` 的结果是？
   - A. `{5, 6}`   ← 正确答案
   - B. `{7, 8}`
   - C. `{9}`
   - D. `{5, 6, 7, 8, 9}`

4. `{10, 20} - {10, 30}` 和 `{10, 30} - {10, 20}` 结果一样吗？
   - 不一样！`{10, 20} - {10, 30} = {20}`，`{10, 30} - {10, 20} = {30}`

5. `{1, 2} & {3, 4}` 的结果是？（没有共同元素）
   - `set()`   ← 空集

**记忆钩子：**
> **"交集 & 取共同，并集 | 合所有，差集 - 有方向"**
> **"& 像筛子滤共同，两杯水倒一起就是 |，- 是减法减重叠"**

---

## 板书设计

```
┌──────────────────────────────────────────────────────┐
│  第06节 集合运算：交集 & / 并集 | / 差集 -            │
│                                                      │
│  s1 = {"red", "blue"}                                │
│  s2 = {"blue", "green"}                              │
│                                                      │
│  ┌──────────────────────────────┐                    │
│  │  s1 & s2 = {"blue"}          │  交集（共同）      │
│  │  s1 | s2 = {"red","blue",    │  并集（全部去重）   │
│  │             "green"}         │                    │
│  │  s1 - s2 = {"red"}          │  差集（A有B没有）   │
│  └──────────────────────────────┘                    │
│                                                      │
│  注意：                                               │
│    s1 - s2 ≠ s2 - s1  ← 差集有方向！                 │
│                                                      │
│  记忆：& 交集 | 并集 - 差集                           │
│  口诀：交集取出共同点，并集合成一大片，差集方向要分辨    │
└──────────────────────────────────────────────────────┘
```

---

## 课后反思

- 学生对"差集方向"是否理解？还是总搞反谁减谁？
- 三种运算是否能区分？还是会混淆 `&` 和 `|`？
- 实操练习中，颜色交集的应用是否达到预期效果？
- 是否需要补充更多生活中的类比帮助学生记忆？
