> **GESP等级：三级 | 考级考点：GESP Python 三级**

# 第02节 列表排序 — sort() 与 sorted()

---

## 课程概况

| 项目 | 内容 |
|------|------|
| **课程名称** | 列表排序：sort() 原地排序 / sorted() 复制排序 |
| **对应GESP考点** | #排序（列表排序方法） |
| **适用对象** | Python初学者（8-14岁） |
| **课时** | 60分钟 |
| **教学形式** | 情境导入（数字排队）+ 对比教学 + turtle可视化 + 闯关练习 |

---

## 教学目标

### 知识与技能
1. 掌握 `list.sort()` 原地排序的用法
2. 掌握 `sorted(list)` 复制排序的用法
3. 理解 `sort()` 与 `sorted()` 的核心区别（原地 vs 复制）
4. 掌握 `reverse=True` 实现降序排列
5. 了解字符串按字母顺序（ASCII码）排序的规则

### 过程与方法
- 通过"数字排队"生活情境对比两种排序方式
- 用对比表格强化 `sort()` vs `sorted()` 的记忆
- 用 turtle 画布直观展示排序前后的变化
- 用"记忆钩子"口诀帮助区分

### 情感态度与价值观
- 感受"排序"这一经典算法在编程中的简洁表达
- 建立"不破坏原始数据"的编程意识（sorted vs sort）
- 体会编程语言设计中对"原地修改"与"复制返回"两种需求的兼顾

---

## 教学重难点

| 类型 | 内容 |
|------|------|
| **重点** | sort() 与 sorted() 的用法以及 reverse 参数 |
| **难点** | sort() 原地修改与 sorted() 返回新列表的本质区别；sort() 返回 None 的理解 |
| **易错点** | 误以为 sort() 有返回值；混淆 sort() 和 sorted() 的适用场景；sorted() 写成了 sort() 的链式调用 |

---

## 教学流程

### 第一环节：导入情境（00:00 - 10:00）— 数字排排队

**教师引导语：**
> "想象你有一排打乱顺序的数字 [3, 1, 4, 1, 5, 9, 2, 6]，要在里面找某个数很费劲。如果排好序 [1, 1, 2, 3, 4, 5, 6, 9]，一眼就能找到！Python 给了我们两种排队方式。"

**互动提问：**
1. "如果全班同学乱站，老师想让大家按身高排，有哪两种办法？"
   - 引导："大家在自己的位置上换位置" → `sort()`（原地排序）
   - 引导："另外找一列重新站队，原队伍不变" → `sorted()`（复制排序）

2. "假如你想从大到小排，怎么办？" → 引出 `reverse=True`

**板书/屏幕展示：**
```
原始: [3, 1, 4, 1, 5, 9, 2, 6]

sort() 原地排:
  numbers.sort()
  → numbers 自己变成了 [1, 1, 2, 3, 4, 5, 6, 9]

sorted() 复制排:
  new_list = sorted(numbers)
  → numbers 不变，new_list 是排好的 [1, 1, 2, 3, 4, 5, 6, 9]
```

---

### 第二环节：知识点精讲（10:00 - 30:00）

#### ① `list.sort()` — 原地排序

```python
numbers = [5, 2, 8, 1, 9]
numbers.sort()                # 原地修改
print(numbers)                # [1, 2, 5, 8, 9]
```

- 特点：**原地修改**原列表，不创建新列表
- 返回值：**None**（不是返回新列表！）
- 记忆：就像同学在**自己的队伍里交换位置**

#### ② `sorted(list)` — 复制排序

```python
numbers = [5, 2, 8, 1, 9]
new_list = sorted(numbers)    # 创建新列表
print(new_list)               # [1, 2, 5, 8, 9]
print(numbers)                # [5, 2, 8, 1, 9] ← 原列表没变！
```

- 特点：**创建并返回**一个排好序的**新列表**
- 原列表**保持不变**
- 适用于不想破坏原始数据的场景
- sorted() 还可以用于其他可迭代对象（字符串、元组等），而 sort() 只能用于列表

#### ③ `reverse=True` — 降序排列

```python
numbers = [3, 1, 4, 1, 5]
numbers.sort(reverse=True)     # 降序
print(numbers)                 # [5, 4, 3, 1, 1]

new_list = sorted(numbers, reverse=True)  # sorted 也支持
```

- `reverse=False`（默认）→ 升序（从小到大）
- `reverse=True` → 降序（从大到小）
- 两个方法都支持该参数

#### ④ 字符串排序

```python
colors = ["red", "blue", "green", "yellow"]
print(sorted(colors))          # ['blue', 'green', 'red', 'yellow']
```

- 字符串按**字母顺序**排序（基于 ASCII 码）
- 大写字母排在小写字母前面（'B'=66 < 'a'=97）
- 汉字按 Unicode 编码排序

#### ⑤ 对比总结表

```
┌──────────────────┬────────────────────────┐
│    sort()        │     sorted()           │
├──────────────────┼────────────────────────┤
│ 原地修改原列表    │ 创建新列表，原列表不变  │
│ 返回 None        │ 返回排序后的新列表     │
│ 只能用于列表      │ 可用于任何可迭代对象   │
│ 速度更快         │ 更灵活，不破坏原数据   │
│ list.sort() 写法 │ sorted(list) 写法      │
└──────────────────┴────────────────────────┘
共同点：都支持 reverse=True 降序排列
```

---

### 第三环节：演示与讲解（30:00 - 40:00）

**现场演示 1 — 颜色名按字母排序**
```python
colors = ["red", "blue", "green", "yellow", "orange", "purple"]
print("原始:", colors)

sorted_colors = sorted(colors)
print("sorted后:", sorted_colors)
print("原列表:", colors)          # 没变！

colors.sort()
print("sort后:", colors)          # 原列表被改了！
```

用 turtle 画出排序前后的彩色圆点，直观对比。

**现场演示 2 — 数字降序柱状图**
```python
import random
numbers = [random.randint(10, 99) for _ in range(8)]
print("原始:", numbers)

asc = sorted(numbers)
desc = sorted(numbers, reverse=True)
print("升序:", asc)
print("降序:", desc)
```

用 turtle 画红色升序柱状图和蓝色降序柱状图，上下对比。

---

### 第四环节：实操闯关（40:00 - 55:00）

#### 实操①：填空题 — sort() vs sorted() 区别（10分钟）

补全每句话：
1. `list.sort()` 是______排序（选：原地/复制）
2. `sorted(list)` 返回一个______列表
3. `list.sort()` 的返回值是______
4. `sorted(list)` 后，原列表______改变（选：会/不会）
5. 想让列表降序排列，用参数______
6. 字符串排序时，按______顺序排列

#### 实操②：排序数字列表 — 四种写法（10分钟）

```python
data = [64, 34, 25, 12, 22, 11, 90]
# 方法1: sort() 升序
# 方法2: sort(reverse=True) 降序
# 方法3: sorted() 升序
# 方法4: sorted(reverse=True) 降序
```

#### 实操③：排序颜色名 — turtle 画彩色圈圈（15分钟）

将乱序的颜色名排序，用 turtle 画两行对比（乱序行 vs 排序行），每行画彩色圆环。

---

### 第五环节：小测与总结（55:00 - 60:00）

#### 小测题目

**选择题：**
> **sort() 和 sorted() 最大的区别是什么？**

A. sort() 只能排数字，sorted() 可以排任何类型
B. sort() 原地修改原列表，sorted() 返回新列表
C. sort() 是函数，sorted() 是方法
D. sort() 不能降序，sorted() 可以

**正确答案：B**

**附加题1：**
```python
colors = ['red', 'blue', 'green']
colors.sort(reverse=True)
print(colors)
# 输出是什么？
```

**附加题2：**
```python
result = [3, 1, 2].sort()
print(result + [4])
# 会报错吗？为什么？
```

#### 记忆钩子

```
★ sort() 原地排  →  原列表被改，返回 None
★ sorted() 复制排 →  原列表不变，返回新列表
★ reverse=True  →  从大到小降序
```

#### 本节课GESP考点对应

| 考点内容 | 对应知识点 |
|---------|-----------|
| #排序（列表排序方法） | sort() / sorted() / reverse参数 |

---

## 课后作业

详见 `课后练习卡_第02节_列表排序.md`

## 教师参考

详见代码文件 `08第02节4_代码.py` 中的完整实现与答案
