# G4-02 课后练习 —— 参数与返回值
> **GESP等级：四级 | 考级考点：GESP Python 四级**

**姓名：__________  日期：__________**

---

| 建议用时 | 20-30分钟 |
| GESP考点 | #32 return返回值 |

---

## 第一部分：基础巩固（3道必做题）

---

### 第1题：选词填空（return 基础理解）

**难度：** ⭐

**GESP考点：【#32 return返回值】**

> 小明写了一个函数，但总是拿不到结果。请帮他填一填！

**题1a：** 下面的函数缺少什么关键字？

```python
def add(a, b):
    result = a + b
    ____ result       # 把结果递出去
```

**从下面选一个：**
- A. `print` ❌
- B. `return` ✅
- C. `send` ❌
- D. `back` ❌

**题1b：** 下面的函数调用，x 的值是什么？

```python
def double(n):
    return n * 2

x = double(5)
```

- ❓ x 的值是：_____
- A. 5 ❌
- B. 10 ✅
- C. None ❌
- D. double(5) ❌

**题1c：** 下面的代码输出什么？

```python
def say_hello():
    print("你好！")
    # 没有 return

r = say_hello()
print(r)
```

- ❓ 输出是：_____
- A. "你好！" 然后 10
- B. "你好！" 然后 None ✅
- C. 报错
- D. None 然后 "你好！"

> 💡 **提示：** 没有 return 的函数默认返回 None！

---

### 第2题：预测输出（return 返回值使用）

**难度：** ⭐⭐

**GESP考点：【#32 return返回值】**

> 读下面的代码，写出每行的输出结果。

```python
def cube(x):
    """返回 x 的立方（x*x*x）"""
    return x * x * x

# 请写出每行 print 的输出
print(cube(2))          # 输出：_______
print(cube(3))          # 输出：_______
print(cube(10))         # 输出：_______
print(cube(2) + cube(3))  # 输出：_______
print(cube(cube(2)))    # 输出：_______
```

**答案区：**

| 代码 | 结果 |
|------|------|
| `cube(2)` | _____ |
| `cube(3)` | _____ |
| `cube(10)` | _____ |
| `cube(2) + cube(3)` | _____（先算 cube(2)=__，再算 cube(3)=__，再相加=__） |
| `cube(cube(2))` | _____（先算里面 cube(2)=__，再算外面 cube(__)=__） |

---

**挑战题（选做）：** 预测下面代码的输出

```python
def add(a, b):
    return a + b

def double(n):
    return n * 2

print(double(add(3, 4)))   # 输出：_______
```

**思路：** 先算 add(3, 4) = _____，再算 double(___) = _____

---

### 第3题：return vs print 对比（理解核心区别）

**难度：** ⭐⭐

**GESP考点：【#32 return返回值】**

> 小强和小红写了两个不同的"打招呼"函数，请帮他们分析有什么区别。

**小强的代码（用 print）：**
```python
def greet_print(name):
    print(f"你好，{name}！")
```

**小红的代码（用 return）：**
```python
def greet_return(name):
    return f"你好，{name}！"
```

**问题1：** 下面的代码输出什么？

```python
# 小强的版本
result1 = greet_print("小明")
print("result1 的值是：", result1)
```

- 输出：_______
- 为什么？_______

**问题2：** 下面的代码输出什么？

```python
# 小红的版本
result2 = greet_return("小明")
print("result2 的值是：", result2)
```

- 输出：_______
- 为什么？_______

**问题3：** 下面的代码哪个能正常运行？

```python
# 代码A
greet_print("小明")
print("---分隔线---")
greet_print("小红")

# 代码B
msg = greet_return("小明")
print(msg)
print("---分隔线---")
msg2 = greet_return("小红")
print(msg2)
```

- ❓ 代码A 能运行吗？_____
- ❓ 代码B 能运行吗？_____
- ❓ 区别是什么？_______

**问题4：** 下面的代码哪个会报错？为什么？

```python
# 代码C
message = greet_print("小明")
print("消息长度：", len(message))

# 代码D
message = greet_return("小明")
print("消息长度：", len(message))
```

- ❓ 代码C：_____（因为 greet_print 返回 _____，len(None) 会报错）
- ❓ 代码D：_____（因为 greet_return 返回 _____，可以求长度）

> 💡 **核心区别：**
> - `print` = 只看不说（显示在屏幕上，但不能继续用）
> - `return` = 说出来递出去（可以存变量、继续运算）
> - **记忆钩子：** print 是"喊出来"，return 是"递出去"！

---

## 第二部分：进阶挑战（2道选做题）

---

### 第4题：改错大挑战

**难度：** ⭐⭐⭐

**GESP考点：【#32 return返回值】**

> 下面每题都有错误，请找出并改正。

**题4a：漏了冒号**

```python
def add(a, b)
    return a + b
```

错误：___________
改正：___________

---

**题4b：return 拼写错误**

```python
def double(n):
    retrun n * 2
```

错误：___________
改正：___________

---

**题4c：return 后面还有代码（不会执行！）**

```python
def divide(a, b):
    return a / b
    print("计算完成！")  # 这行永远不会执行！
```

问题：___________（提示：return 一执行，函数就结束了）
改正：___________（把 print 移到 return 前面）

---

**题4d：没有 return，函数返回 None**

```python
def square(x):
    result = x * x
    # 忘记写 return 了

print(square(5))  # 输出 None，而不是 25
```

错误：___________
改正：___________

---

### 第5题：创意挑战——温度转换器

**难度：** ⭐⭐⭐

**GESP考点：【#32 return返回值】**

> 写一个函数 `c_to_f(c)`，把摄氏温度转换成华氏温度，并返回结果。
>
> 公式：**华氏温度 = 摄氏温度 × 9/5 + 32**

**参考代码框架：**

```python
def c_to_f(c):
    """将摄氏温度转换为华氏温度"""
    f = ________ * ________ + ________  # 填空：套公式
    return ________                      # 返回转换结果

# 测试
print(c_to_f(0))     # 0°C = 32°F → 应该输出 32.0
print(c_to_f(100))   # 100°C = 212°F → 应该输出 212.0
print(c_to_f(30))    # 30°C = 86°F → 应该输出 86.0
print(c_to_f(-10))   # -10°C = 14°F → 应该输出 14.0
```

**需要填的空：**
1. `c`（摄氏温度）
2. `9/5` 或 `1.8`
3. `32`（加32）
4. `f`（返回 f）

**如果你完成了：** 再写一个反向转换函数 `f_to_c(f)`！

**公式：** **摄氏温度 = (华氏温度 - 32) × 5/9**

```python
def f_to_c(f):
    """将华氏温度转换为摄氏温度"""
    c = ________
    return ________

# 测试
print(f_to_c(32))    # 32°F = 0°C → 应该输出 0.0
print(f_to_c(212))   # 212°F = 100°C → 应该输出 100.0
```

---

## 完成情况表

请家长/学生勾选完成情况：

|------|------|------|---------|---------|
| 第1题 | 选词填空 | ⭐ | ✅ / ❌ | |
| 第2题 | 预测输出 | ⭐⭐ | ✅ / ❌ | |
| 第3题 | return vs print 对比 | ⭐⭐ | ✅ / ❌ | |
| 第4题 | 改错挑战 | ⭐⭐⭐ | ✅ / ❌（选做） | |
| 第5题 | 温度转换器 | ⭐⭐⭐ | ✅ / ❌（选做） | |

---

## 家长辅导小贴士

1. **return 的核心比喻**——"做完事大声汇报"：函数里的代码算好了结果，用 return 把这个结果"递出去"给调用者。没有 return 就像闷葫芦，算了也白算。

2. **return vs print 的区别**——这是孩子最容易混淆的：
   - `return` = 把值递出去（外面可以接住继续用）
   - `print` = 显示在屏幕上（只能看，不能继续用）
   - 举例：`return` 就像厨师把菜端出厨房给客人吃，`print` 就像厨师在厨房里喊"菜做好了"——客人吃不到。

3. **函数调用就是一个值**——`add(3, 5)` 这个表达式本身就是一个值（等于 8），可以直接打印、存变量、参与运算。这是理解函数式思维的关键。

4. **None 的概念**——None 就是"空"、"什么都没有"。不是 0（0 是数字），不是 False（False 是布尔值），就是"没东西"。想象一个快递盒子，打开一看——空的，这就是 None。

5. **检查代码的要点**：
   - 函数定义末尾有没有冒号 `:`？
   - `return` 拼写对不对？（不是 retrun/returen/retrn）
   - return 后面有没有空格 + 要返回的值？
   - return 后面还有代码吗？（return 后面的代码永远不会执行！）

6. **链式调用怎么理解**——从内往外拆：
   - `double(double(3))` → 先算里面的 `double(3)=6`，再算外面的 `double(6)=12`
   - 就像剥洋葱，一层一层剥开


---

**自我评价：** □ 全都会了  □ 大部分会了  □ 还要再练练
