> **GESP等级：二级 | 考级考点：GESP Python 二级**

# 📐 第18节：数学函数大全

> **课程定位**：GESP二级必考 · 少儿编程入门
> **面向年龄**：7-10岁
> **课时长度**：60分钟
> **核心工具**：turtle + Python内置数学函数

---

## 📋 教学目标

| 维度 | 目标 |
|------|------|
| 知识 | 掌握 abs() / max() / min() / round() / math.ceil() / math.floor() / sum() 的用法 |
| 技能 | 能区分不同导入方式，能判断函数返回值类型和值 |
| 思维 | 建立"函数=小工具"的思维模型，看到数字能联想到对应的数学函数 |
| 情感 | 觉得数学函数"好玩不恐怖"，愿意主动尝试 |

---

## 🧩 教学准备

| 项目 | 内容 |
|------|------|
| 软件 | Python 3.8+、IDLE / Thonny / VS Code |
| 文件 | `04_数学函数大全.py` |
| 教具 | 大号数字卡片（-5, -3, 0, 2, 4, 7, 9）、身高尺贴纸 |
| 环境 | 确保 turtle 画布能正常弹出 |

---

## 🕐 第一段：导入 · 10分钟 —— "数学工具箱开箱记"

### 🎬 开场故事（3分钟）

> 小派（turtle）收到一个快递箱，箱子上写着"数学函数工具包"。
> 打开一看，里面有好多神奇的小工具——
> 有的能把负数变正，有的能在一堆数里找到最大的，
> 有的能帮你"四舍五入"，还有的能帮你算总账……

**老师问**："猜猜看，这些工具叫什么名字？"
**学生猜**：绝对值、最大值、四舍五入……

**老师揭晓**："它们就是——数学函数！每个函数就像一把瑞士军刀上的小工具，各有各的本事！"

### 🧠 记忆钩子·工具箱比喻

```
┌─────────────────────────────────────────┐
│           数学函数工具箱                    │
│  📏 abs()     —— 距离矫正器              │
│  📐 max()     —— 最高挑选器              │
│  📐 min()     —— 最矮挑选器              │
│  🔄 round()   —— 四舍五入调节器            │
│  ⬆️ ceil()    —— 天花板升高器              │
│  ⬇️ floor()   —— 地板降低器               │
│  🧮 sum()     —— 总数加总器               │
└─────────────────────────────────────────┘
```

### 🏃 热身小游戏（5分钟）

**游戏名**："数字排队"

1. 老师亮出数字卡片：-5, -3, 0, 2, 4, 7, 9
2. 请3位同学上台，每人抽一张卡片
3. **任务一**：找出谁的数字"最大" → 引出 max()
4. **任务二**：找出谁的数字"最小" → 引出 min()
5. **任务三**：往前走5步，往后退3步，离起点几步？→ 引出 abs()

**身体锚点植入**：
- 手向上指（跳起来）→ "我要 ceil！往上取整！"
- 手向下指（蹲下去）→ "我要 floor！往下取整！"
- 手平推（左右摇晃）→ "我要 round！四舍五入！"

### 🔗 过渡语

> "好的，工具箱已经打开，让我们一件一件拿出来看看吧！先看第一件——"

---

## 🕐 第二段：知识点 · 20分钟 —— "函数逐个学"

---

### 📌 知识点1：`abs(x)` —— 绝对值（3分钟）

#### 童趣解释

> **"距离没有负数"**
>
> 想象你从家门出发，往前走5步是+5，往后退3步是-3。
> 但不管你往前走还是往后退，**你离家门有多远**这个距离，永远是正数！
> `abs()` 就是帮你算"距离家门多远"的工具——它把负号吃掉，只留下正数！

#### 代码示例

```python
print(abs(5))    # 输出 5
print(abs(-3))   # 输出 3 —— 负号被吃掉了！
print(abs(0))    # 输出 0
```

#### 生活场景

| 场景 | 数字 | abs结果 | 解释 |
|------|------|---------|------|
| 电梯从1楼到地下3层 | -3 | 3 | 坐了3层 |
| 温度从0度降到-5度 | -5 | 5 | 降了5度 |
| 银行欠款100元 | -100 | 100 | 欠了100元 |

#### 🧠 记忆钩子

> **身体锚点**：双手做"吃掉"动作 → "abs把负号吃掉啦！"
> **口诀**："abs abs 吃负号，出来都是正数宝！"

#### GESP考点

```python
# 考点1：abs(-10) 的返回值是 int 类型，值为 10
# 考点2：abs(3.14) 的返回值是 float 类型，值为 3.14
# 考点3：abs(0) 的返回值是 int 类型，值为 0
```

---

### 📌 知识点2：`max()` —— 最大值（2分钟）

#### 童趣解释

> **"找出最高的"**
>
> 体育课上，老师说"谁最高？"同学们排排站，最高的那个被选出来。
> `max()` 就是做这件事的——你给它一堆数字，它帮你选出最大的那个！

#### 代码示例

```python
print(max(3, 7, 5))        # 输出 7
print(max(-1, -5, -3))     # 输出 -1（负数里最大的）
print(max(10, 20, 15, 8))  # 输出 20
```

#### 生活场景

> 三个朋友的身高：120cm、135cm、128cm → `max(120, 135, 128)` → 135cm

#### 🧠 记忆钩子

> **身体锚点**：踮起脚尖手往上够 → "选最高！"
> **口诀**："max max 选最高，数字堆里它最傲！"

#### GESP考点

```python
# 考点：max(10, 3.14, 5) 返回值是 10，类型是 int
# 注意：max("a", "b", "c") 也可以用在字符串上！返回 "c"
```

---

### 📌 知识点3：`min()` —— 最小值（2分钟）

#### 童趣解释

> **"找出最矮的"**
>
> 还是体育课，老师说"谁最矮？"同学们排排站，最矮的那个被选出来。
> `min()` 就是做这件事的——你给它一堆数字，它帮你选出最小的那个！

#### 代码示例

```python
print(min(3, 7, 5))        # 输出 3
print(min(-1, -5, -3))     # 输出 -5（负数里最小的）
print(min(10, 20, 15, 8))  # 输出 8
```

#### 生活场景

> 三个蛋糕的价格：25元、18元、30元 → `min(25, 18, 30)` → 18元（最便宜的）

#### 🧠 记忆钩子

> **身体锚点**：蹲下身子手压低 → "选最矮！"
> **口诀**："min min 选最矮，数字堆里它最小！"

#### 🔗 对比记忆

```
max() = 踮脚尖往上够  →  最大的
min() = 蹲下来压低   →  最小的
```

---

### 📌 知识点4：`round(x)` —— 四舍五入（3分钟）

#### 童趣解释

> **"四舍五入取整"**
>
> 想象数字在玩"跳崖游戏"——
> 3.2 站在3和4之间，它离3更近，所以它跳到了3！
> 3.7 站在3和4之间，它离4更近，所以它跳到了4！
> 3.5 呢？它正好在中间，按规矩——**往大的跳**，跳到4！
>
> 口诀：**小于5就舍掉，大于等于5就入上去！**

#### 代码示例

```python
print(round(3.2))    # 输出 3（3.2离3更近）
print(round(3.7))    # 输出 4（3.7离4更近）
print(round(3.5))    # 输出 4（正好中间，往大的走）
print(round(4.5))    # 输出 4（银行家舍入：5前偶则舍）
print(round(3.14159, 2))  # 输出 3.14（保留2位小数）
```

> ⚠️ **给老师的备注**：Python 3 的 round() 采用"银行家舍入"（奇进偶不进），但7-10岁阶段教"四舍五入"基本规则即可，不深究边界情况。GESP二级也不考边界奇偶问题。

#### 🧠 记忆钩子

> **身体锚点**：双手平推，左右晃动 → "摇摆不定？四舍五入帮决定！"
> **口诀**："round round 摇啊摇，小于5舍大于5入，站在中间往大靠！"

#### GESP考点

```python
# 考点1：round(4.6) 返回值是 5，类型是 int
# 考点2：round(4.4) 返回值是 4，类型是 int
# 考点3：round(3.14159, 2) 返回值是 3.14，类型是 float
```

---

### 📌 知识点5：`math.ceil(x)` —— 向上取整（2分钟）

#### 童趣解释

> **"往大的方向取整——天花板"**
>
> 想象你站在一个房间里，**天花板在上面**。
> `ceil()` 就是把数字"往天花板上扔"——不管小数部分是多少，都往大的整数走！
> 就像气球往上飘一样。

#### 代码示例

```python
import math

print(math.ceil(3.1))    # 输出 4（3.1往上到4）
print(math.ceil(3.9))    # 输出 4（3.9往上到4）
print(math.ceil(-3.1))   # 输出 -3（-3.1往上到-3）
print(math.ceil(5.0))    # 输出 5（本来就是整数）
```

> ⚠️ 负数时要注意：-3.1 往上取整是 -3，不是 -4！
> 因为"往上"是往正数大的方向走，-3.1 上面是 -3，再上面是 -2……

#### 🧠 记忆钩子

> **身体锚点**：手指向上猛指 → "ceil！天花板！往上冲！"
> **口诀**："ceil ceil 往上飘，不管多少都向高！"

#### GESP考点

```python
# 考点1：math.ceil(3.14) 返回值是 4，类型是 int
# 考点2：math.ceil(-2.5) 返回值是 -2，类型是 int
# 考点3：需要 import math 才能用
```

---

### 📌 知识点6：`math.floor(x)` —— 向下取整（2分钟）

#### 童趣解释

> **"往小的方向取整——地板"**
>
> 还是那个房间，**地板在下面**。
> `floor()` 就是把数字"往地板上摔"——不管小数部分是多少，都往小的整数走！
> 就像石头往下掉一样。

#### 代码示例

```python
import math

print(math.floor(3.1))    # 输出 3（3.1往下到3）
print(math.floor(3.9))    # 输出 3（3.9往下到3）
print(math.floor(-3.1))   # 输出 -4（-3.1往下到-4）
print(math.floor(5.0))    # 输出 5（本来就是整数）
```

#### 🧠 记忆钩子

> **身体锚点**：手指向下猛指 → "floor！地板！往下蹲！"
> **口诀**："floor floor 往下掉，不管多少都向小！"

#### 🔗 ceil vs floor 对比

| 数字 | math.ceil() | math.floor() |
|------|-------------|--------------|
| 3.1 | 4 ⬆️ | 3 ⬇️ |
| 3.9 | 4 ⬆️ | 3 ⬇️ |
| -3.1 | -3 ⬆️ | -4 ⬇️ |
| -3.9 | -3 ⬆️ | -4 ⬇️ |
| 5.0 | 5 | 5 |

> **超级口诀**：
> "ceil 像气球往上飘，floor 像石头往下掉！
> 一个找天花板，一个找地板，两个好朋友反着干！"

---

### 📌 知识点7：三种导入方式（3分钟）

#### 🎬 故事引入

> 小派想用数学工具包里的工具，但是——工具包在仓库里锁着呢！
> 有三种办法能拿到工具，就像三种"开门方式"：

#### 方式一：`import math` —— 整个工具箱搬来

```python
import math

print(math.ceil(3.2))    # 要写 math.ceil
print(math.floor(3.2))   # 要写 math.floor
print(math.sqrt(9))      # 要写 math.sqrt
```

> **比喻**：把整个工具箱搬到你桌上。想用哪个工具，都要说"工具箱里的xxx"
> **优点**：不会搞混，知道每个工具从哪来的
> **缺点**：每次要多打一个"math."

#### 方式二：`from math import *` —— 把所有工具倒出来

```python
from math import *

print(ceil(3.2))     # 直接写 ceil！
print(floor(3.2))    # 直接写 floor！
print(sqrt(9))       # 直接写 sqrt！
```

> **比喻**：把工具箱"哗啦"全倒在桌上。想用哪个直接拿！
> **优点**：打字少，方便
> **缺点**：工具堆在一起，万一你自己也有个叫 ceil 的函数，就打架了！

#### 方式三：`import math as m` —— 给工具箱起小名

```python
import math as m

print(m.ceil(3.2))     # 写 m.ceil！
print(m.floor(3.2))    # 写 m.floor！
```

> **比喻**：给工具箱贴个标签叫"小m"，想用工具就说"小m家的xxx"
> **优点**：打字少了一半，又不会搞混
> **推荐**：最常用、最方便的方式！

#### 🧠 记忆钩子

```
方式一：import math      -> 整个工具箱 -> math.工具名
方式二：from math import * -> 全倒出来  -> 直接写工具名
方式三：import math as m  -> 贴小名    -> m.工具名
```

**老师小口诀**：
> "import math 最标准，from math star 最方便，import as 起小名——我最爱！"

#### GESP考点

```python
# 考点1：import math 后要用 math.ceil(x) 调用
# 考点2：from math import * 后可直接用 ceil(x)
# 考点3：import math as m 后要用 m.ceil(x) 调用
# 考点4：三种方式不能混用（比如 import math 后直接写 ceil(x) 会报错！）
```

---

### 📌 知识点8：`sum()` —— 求和（3分钟）

#### 童趣解释

> **"总数加总器"**
>
> 你有零花钱：小猪存钱罐里有一堆硬币。
> 要算一共有多少钱，不用一个一个加——用 `sum()` 一次搞定！
> 但是注意：**sum() 是装在列表上用的**，就像给列表穿上一件"加法外套"！

#### 代码示例

```python
# sum() 用在列表上
scores = [85, 92, 78, 95]
total = sum(scores)
print(total)              # 输出 350

# 也可以直接写
print(sum([1, 2, 3, 4, 5]))  # 输出 15
```

#### 生活场景

> 小派一周走了多少步？
> Monday=3200, Tuesday=4500, Wednesday=3800, Thursday=5100, Friday=4200
> `sum([3200, 4500, 3800, 5100, 4200])` = 20800 步！

#### 对比记忆：不用 sum vs 用 sum

```python
# 笨办法 —— 一个一个加
total = 85 + 92 + 78 + 95

# 聪明办法 —— 用 sum()
total = sum([85, 92, 78, 95])
```

#### 🧠 记忆钩子

> **身体锚点**：双手做"收拢"动作 → "sum 就是把所有数收拢加在一起！"
> **口诀**："sum sum 收收收，列表里的数全加走！"

#### GESP考点

```python
# 考点1：sum([1, 2, 3]) 返回值是 6，类型是 int
# 考点2：sum([1.5, 2.5, 3.0]) 返回值是 7.0，类型是 float
# 考点3：sum() 的参数必须是可迭代对象（最常见的是列表）
# 考点4：sum([]) 空列表返回 0
```

---

### 📌 知识点小结表（1分钟）

| 函数 | 作用 | 记忆钩子 | 身体锚点 |
|------|------|----------|----------|
| `abs(x)` | 取绝对值（吃负号） | 距离没有负数 | 双手做"吃掉"动作 |
| `max(a,b,c...)` | 取最大值 | 选最高的同学 | 踮脚尖往上够 |
| `min(a,b,c...)` | 取最小值 | 选最矮的同学 | 蹲下身子压低 |
| `round(x)` | 四舍五入 | 小于5舍，大于等于5入 | 双手平推摇晃 |
| `math.ceil(x)` | 向上取整 | 天花板 | 手指向上指 |
| `math.floor(x)` | 向下取整 | 地板 | 手指向下指 |
| `sum(列表)` | 求和 | 总数加总器 | 双手收拢 |

---

## 🕐 第三段：演示 · 10分钟 —— "Turtle 画函数"

### 🎯 演示目标

> 用 turtle 画出每个数学函数的效果，让数字"看得见"！

### 🖥️ 打开代码文件 `04_数学函数大全.py`

老师带领学生一行行看代码，重点讲解：

#### 演示1：abs() —— 小派走路的距离

```python
import turtle

t = turtle.Turtle()
t.speed(3)

# 向前走100步
t.forward(100)
# 向后退60步
t.backward(60)
# 问：小派离起点多远？
# 答：100 - 60 = 40，用 abs 算距离！
distance = abs(100 - 60)
t.write(f"离起点{distance}步", font=("Arial", 16, "normal"))
```

**老师操作**：在 turtle 画布上展示小派走路的轨迹，画出距离标注。

#### 演示2：max/min —— 坐标大比拼

```python
# 三个点的x坐标
x1, x2, x3 = -50, 120, 30
# 找出最右边（最大）和最左边（最小）
rightmost = max(x1, x2, x3)    # 120
leftmost = min(x1, x2, x3)     # -50

t.penup()
t.goto(rightmost, 0)
t.write("最右边!", font=("Arial", 14, "normal"))
t.goto(leftmost, 0)
t.write("最左边!", font=("Arial", 14, "normal"))
```

**老师操作**：在 turtle 画布上画出三个点，用 max/min 标出最左和最右。

#### 演示3：round / ceil / floor 对比

```python
import math

number = 3.6
# 画三条线表示结果
t.penup()
t.goto(-200, 100)
t.write(f"原始数字: {number}", font=("Arial", 16, "normal"))

t.goto(-200, 50)
t.write(f"round({number}) = {round(number)}", font=("Arial", 16, "normal"))

t.goto(-200, 0)
t.write(f"ceil({number}) = {math.ceil(number)}", font=("Arial", 16, "normal"))

t.goto(-200, -50)
t.write(f"floor({number}) = {math.floor(number)}", font=("Arial", 16, "normal"))
```

**老师操作**：用不同颜色标注 round、ceil、floor 的结果差异。

#### 演示4：sum() —— 统计步数

```python
steps = [30, 50, 20, 40, 60]
total_steps = sum(steps)

for step in steps:
    t.forward(step)
    t.left(72)  # 五边形

t.write(f"总步数: {total_steps}", font=("Arial", 16, "normal"))
```

**老师操作**：小派走五边形，每段长度由列表决定，最下面显示总步数。

---

### 📊 完整演示流程

| 步骤 | 老师做 | 学生看 | 时间 |
|------|--------|--------|------|
| 1 | 打开代码文件，运行 | 看 turtle 画布弹出 | 1min |
| 2 | 展示 abs() 部分 | 看小派走路和距离 | 2min |
| 3 | 展示 max/min 部分 | 看点坐标比较 | 2min |
| 4 | 展示 round/ceil/floor | 看三个取整结果对比 | 3min |
| 5 | 展示 sum() 部分 | 看小派画多边形 | 2min |

---

## 🕐 第四段：实操 · 15分钟 —— "我是函数小达人"

### 📝 任务分配

学生独立完成 `04_数学函数大全.py` 中的 **挑战任务** 部分（文件末尾）。

### 🚀 三个挑战关卡

#### 关卡1：填空小热身（5分钟）

在代码的填空区域完成：

```python
# 1. 用 abs 算出 -8 的绝对值
print(abs(____))  # 应该输出 8

# 2. 用 max 找出 45, 67, 23 中最大的
print(max(____, ____, ____))  # 应该输出 67

# 3. 用 min 找出 45, 67, 23 中最小的
print(min(____, ____, ____))  # 应该输出 23
```

#### 关卡2：仿写小能手（5分钟）

```python
# 1. 仿照例子，用 round 把 4.6 四舍五入
print(round(____))  # 应该输出 5

# 2. 用 math.ceil 把 2.1 向上取整
import math
print(math.ceil(____))  # 应该输出 3

# 3. 用 math.floor 把 2.9 向下取整
print(math.floor(____))  # 应该输出 2
```

#### 关卡3：创作小画家（5分钟）

> 用 turtle 画出"函数对比图"：
> 1. 在画布上写一个数字（比如 4.3）
> 2. 在下面分别写出 round / ceil / floor 的结果
> 3. 用不同颜色的笔来画

**提示代码**：
```python
import turtle
import math

t = turtle.Turtle()
t.pensize(3)

# 你的代码写在这里！
num = 4.3

# 用红色写原始数字
t.pencolor("red")
t.write(num, font=("Arial", 20, "normal"))

# 用蓝色写 round 结果
t.pencolor("blue")
# 移动位置后写 round(num)

# 用绿色写 ceil 结果
t.pencolor("green")
# 移动位置后写 math.ceil(num)

# 用橙色写 floor 结果
t.pencolor("orange")
# 移动位置后写 math.floor(num)
```

### 👩‍🏫 老师巡场指导重点

1. **常见错误1**：`math.ceil()` 忘记写 `import math`
   - 提示："你的工具箱没搬来哦！加一句 import math"
2. **常见错误2**：`sum()` 忘写方括号 `[` `]`
   - 提示："sum 要配列表用，记得加方括号！"
3. **常见错误3**：大小写写错 `Ceil` 而不是 `ceil`
   - 提示："Python 是大小写敏感的，小写才行！"

---

## 🕐 第五段：小测 · 5分钟 —— "函数大闯关"

### 📄 5道选择题（快速抢答）

```
1. abs(-15) 的结果是？
   A. -15   B. 15   C. 0   D. 错误
   答案：B（abs 吃负号！）

2. max(8, 3, 12, 5) 的结果是？
   A. 3   B. 5   C. 8   D. 12
   答案：D（最高的那个！）

3. min(8, 3, 12, 5) 的结果是？
   A. 3   B. 5   C. 8   D. 12
   答案：A（最矮的那个！）

4. round(4.7) 的结果是？
   A. 4   B. 5   C. 4.7   D. 错误
   答案：B（4.7 >= 5，入上去=5）

5. 下面哪个 ceil 的写法是正确的？
   A. ceil(3.2)        B. math.ceil(3.2)
   C. 上面两个都对     D. 上面两个都错
   答案：B（需要 import math 后再用 math.ceil）

6. （附加题）sum([10, 20, 30]) 的结果是？
   A. 10   B. 30   C. 60   D. 错误
   答案：C（10+20+30=60）
```

### 🏆 奖励机制

- 答对3题 -> "函数学徒"勋章
- 答对5题 -> "函数大师"勋章
- 答对6题（含附加题）-> "函数王者"勋章

### 📝 小测自查表

```
□ 我知道 abs 会把负数变正数
□ 我知道 max 和 min 的区别
□ 我会用 round 四舍五入
□ 我会用 ceil 和 floor
□ 我知道 sum() 要配合列表用
□ 我知道三种 import 方式的不同
```

---

## 🧩 板书设计

```
+-----------------------------------------------------------------+
|  📐 第18节：数学函数大全                                          |
|                                                                   |
|  📏 abs(x)    = |x|    "吃负号"    abs(-5) = 5                  |
|  📐 max(a,b)           "最高"      max(3,7,5) = 7               |
|  📐 min(a,b)           "最矮"      min(3,7,5) = 3               |
|  🔄 round(x)           "四舍五入"  round(3.6) = 4               |
|  ⬆️ ceil(x)            "天花板"    ceil(3.1) = 4                 |
|  ⬇️ floor(x)           "地板"      floor(3.9) = 3                |
|  🧮 sum([])            "总和"      sum([1,2,3]) = 6             |
|                                                                   |
|  身体锚点：                                                       |
|  ↑ ceil    ↓ floor    ↔ round    🤲 abs    🙆 max    🙇 min     |
+-----------------------------------------------------------------+
```

---

## 📚 课后延伸

### 给家长的话

> 今天孩子学习了 Python 中的"数学函数"——这其实是 GESP 二级考试的必考内容！
> 我们学了 8 个函数：abs、max、min、round、ceil、floor、sum，以及三种导入方式。
> 孩子已经学会用 turtle 把这些函数"画"出来，让数学变得看得见、摸得着。

### 家庭小任务

1. 让孩子用 `abs()` 计算家里的温度差（比如：空调设定26度，室外38度，差多少？）
2. 用 `max()` 和 `min()` 比较全家人的身高
3. 让孩子教你"ceil 天花板"和"floor 地板"的手势

---

## ⚠️ 常见问题与应对

| 学生问题 | 老师应对 |
|----------|----------|
| "为什么要学数学函数？" | "GESP二级要考呀！而且生活中到处都用得到——比如算零花钱、比身高。" |
| "abs 有什么用？" | "算距离、算温差、算欠款——所有只要关心'多少'不关心'方向'的地方！" |
| "ceil 和 floor 好难记" | "用手势！手指向上——ceil天花板！手指向下——floor地板！" |
| "为什么 sum 要加方括号？" | "因为 sum 是'列表专属工具'，方括号就是列表的'身份证'！" |
| "三种导入方式用哪个？" | "平时写代码推荐 `import math as m`，打字少又不会混。" |

---

## 📊 课后教师反思

| 项目 | 评价 | 备注 |
|------|------|------|
| 学生参与度 | □高 □中 □低 | |
| 难点掌握情况 | □好 □一般 □需强化 | |
| turtle演示效果 | □好 □一般 □需改进 | |
| 时间控制 | □正好 □拖堂 □提前 | |
| 需要改进的地方 | | |
