> **GESP等级：三级 | 考级考点：GESP Python 三级**

# 第2节 集合运算——交集 & / 并集 | / 差集 -

**GESP考点：** #33（集合运算）、#34（集合推导与成员检测）

---

## 导入：两个班的颜色喜好

| A班喜欢的颜色 | B班喜欢的颜色 |
|:------------:|:------------:|
| 红色、蓝色、绿色 | 蓝色、黄色、绿色 |

**三个问题：**
1. 两个班都喜欢哪些颜色？→ **交集 &**
2. 两个班所有颜色合在一起有哪些？→ **并集 |**
3. A班有但B班没有的颜色？→ **差集 -**

**用集合表示：**
```python
class_a = {"红色", "蓝色", "绿色"}
class_b = {"蓝色", "黄色", "绿色"}

print(class_a & class_b)  # 交集 → {"蓝色", "绿色"}
print(class_a | class_b)  # 并集 → {"红色", "蓝色", "绿色", "黄色"}
print(class_a - class_b)  # 差集 → {"红色"}
```

**生活类比：**
> **交集 &** = 朋友圈的共同好友
> **并集 |** = 两班合班上大课
> **差集 -** = "我独有的"

---

## ① 交集 `&` —— 取「都有」的元素

```python
s1 = {"red", "blue"}
s2 = {"blue", "green"}
print(s1 & s2)  # {"blue"}
```

**要点：**
- `&` 运算符，取两个集合中**共同存在**的元素
- 相当于数学中的"交集 ∩"
- 没有共同元素时，结果是空集 `set()`
- 记忆：`&` 像一张过滤网，只兜住两边都有的

---

## ② 并集 `|` —— 取「全部」元素（去重）

```python
s1 = {"red", "blue"}
s2 = {"blue", "green"}
print(s1 | s2)  # {"red", "blue", "green"}
```

**要点：**
- `|` 运算符，合并两个集合的全部元素
- 自动**去重**——重复元素只保留一份
- 相当于数学中的"并集 ∪"
- 记忆：`|` 像两杯水倒进一个杯子

---

## ③ 差集 `-` —— 取「A有B没有」的元素

```python
s1 = {"red", "blue"}
s2 = {"blue", "green"}
print(s1 - s2)  # {"red"}
print(s2 - s1)  # {"green"}
```

**要点：**
- `-` 运算符，从 A 中去掉也在 B 中的元素
- **方向很重要！** `A - B ≠ B - A`
- 记忆：`-` 像减法，减掉对方也有的

---

## 三种运算对比

| 运算 | 符号 | 含义 | 数学符号 | 示例 s1-s2 |
|:----:|:----:|:----:|:--------:|:----------:|
| 交集 | `&` | 两边都有 | ∩ | `{"blue"}` |
| 并集 | `\|` | 全部合并去重 | ∪ | `{"red","blue","green"}` |
| 差集 | `-` | A有B没有 | \ | `{"red"}`（与顺序有关） |

**快速记忆口诀：**
> **"交集取出共同点，并集合成一大片，差集方向要分辨"**

---

## 演示：数字集合运算

```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}        ← 差集：a有b没有
print(b - a)  # {6, 7, 8}        ← 差集（反向）：b有a没有
```

---

## 应用：画家和同学的颜料

| 角色 | 颜料 |
|:---:|:----:|
| 画家 | 红、蓝、紫 |
| 同学 | 蓝、绿、黄 |

```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)  # {"绿", "黄"}   ← 同学独有
```

---

## 实操练习

### 练习1：填空选择运算符号

```python
A = {"苹果", "香蕉", "橘子"}
B = {"香蕉", "橘子", "西瓜"}

# A _ B = {"苹果"}              ← 填 -（差集）
# A _ B = {"苹果","香蕉","橘子","西瓜"}  ← 填 |（并集）
# A _ B = {"香蕉", "橘子"}      ← 填 &（交集）
```

### 练习2：心算集合运算结果

```python
# ① {"a", "b", "c"} & {"b", "c", "d"} = ?
# ② {1, 2, 3} | {4, 5, 6} = ?
# ③ {10, 20, 30, 40} - {30, 40, 50} = ?
# ④ {"x", "y"} - {"y", "z"} = ?
# ⑤ {100, 200} & {100, 200, 300} = ?
```

### 练习3：三个小朋友的积木颜色

| 小朋友 | 积木颜色 |
|:-----:|:--------:|
| 小明 | 红、黄、蓝、绿 |
| 小红 | 蓝、绿、紫、橙 |
| 小刚 | 绿、橙、粉、红 |

```
题目1：小明和小红的共同颜色 → 小明 & 小红 = ?
题目2：三人所有积木合在一起 → 小明 | 小红 | 小刚 = ?
题目3：小明有但小红没有的 → 小明 - 小红 = ?
题目4：三人都有颜色 → 小明 & 小红 & 小刚 = ?
题目5：小红比小明多哪些 → 小红 - 小明 = ?
```

---

## 小测

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}` 结果一样吗？为什么？

5. `{1, 2} & {3, 4}` = ?（没有共同元素）

---

## 总结

| 运算 | 符号 | 记忆钩子 |
|:----:|:----:|:--------:|
| 交集 | `&` | 共同好友——两边都有才算 |
| 并集 | `\|` | 合班上大课——全部合在一起去重 |
| 差集 | `-` | 减法——减掉重叠，剩独有 |

**速记口诀：**
> **& 像筛子滤共同，两杯水倒一起就是 |**
> **- 是减法减重叠，差集顺序要牢记**

---

## 课后作业

见 `10第2节4_作业.md`
