# 返回值与函数嵌套

URL: https://caijiao.org/python/ch05/return-nesting
Source: docs/python/ch05/return-nesting.md
Description: 本章节介绍 Python 中函数的返回值和函数嵌套的使用，详细讲解如何使用 'return' 返回结果，以及如何在一个函数内部定义并调用另一个函数，帮助你组织更复杂的代码结构。

在 [Python](/python/) 中，函数不仅可以接收参数并执行任务，还可以返回值。除此之外，Python 也支持函数嵌套，即在一个函数内定义和调用另一个函数。理解这两种特性能帮助你编写更加灵活、可维护的代码。

## 返回值

函数的返回值是 Python 函数的一个重要特性。通过 `return` 语句，函数可以返回一个结果，供外部调用者使用。

### 使用 `return` 返回值

```python
def add(a, b):
    return a + b

result = add(2, 3)
print(result)  # 5
```

在这个例子中，`add` 函数计算两个参数的和，并通过 `return` 语句返回结果。

### 返回多个值

Python 允许函数返回多个值，这些值会作为元组返回。

```python
def get_coordinates():
    x = 10
    y = 20
    return x, y

x, y = get_coordinates()
print(x, y)  # 10 20
```

在这个例子中，`get_coordinates()` 返回了两个值，分别是 `x` 和 `y`，它们被接收并打印。

### 返回值与 `None`

如果一个函数没有显式的 `return` 语句，Python 会默认返回 `None`。

```python
def say_hello():
    print("Hello!")

result = say_hello()
print(result)  # None
```

此时，`say_hello()` 函数没有返回任何值，因此返回了 `None`。

## 函数嵌套

函数嵌套是指在一个函数内部定义另一个函数。内嵌的函数可以访问外部函数的变量，这为编写更具灵活性的代码提供了便利。

### 嵌套函数的基本用法

```python
def outer_function():
    x = 10

    def inner_function():
        print(f"Inner function accessing outer variable: {x}")

    inner_function()

outer_function()  # 输出：Inner function accessing outer variable: 10
```

在这个例子中，`inner_function` 是在 `outer_function` 内部定义的，它可以访问外部函数 `outer_function` 中的变量 `x`。

### 闭包 (Closure)

闭包是指在函数内部定义的函数，它不仅可以访问外部函数的变量，还能“记住”外部函数的状态。

```python
def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

add_5 = outer_function(5)
result = add_5(3)  # 8
print(result)
```

在这个例子中，`add_5` 是一个闭包，它记住了 `outer_function` 的参数 `x`。调用 `add_5(3)` 时，它将 `x` 和 `y` 相加，返回结果 8。

### 嵌套函数的作用

嵌套函数可以用来组织代码，尤其在以下情况下非常有用：

- **逻辑分隔**：内嵌函数可以将特定的逻辑封装在外部函数内，避免污染全局命名空间。
- **创建工厂函数**：通过返回内嵌函数，允许动态生成可重用的函数。

```python
def power(exponent):
    def raise_to_power(base):
        return base ** exponent
    return raise_to_power

square = power(2)
cube = power(3)

print(square(5))  # 25
print(cube(5))    # 125
```

在这个例子中，`power` 函数返回一个内嵌的 `raise_to_power` 函数，从而创建了两个不同的函数：`square` 和 `cube`。

## 总结

- **返回值**：函数可以通过 `return` 返回一个或多个值。如果没有 `return`，默认返回 `None`。
- **函数嵌套**：在一个函数内定义另一个函数，内嵌函数可以访问外部函数的变量，并且支持创建闭包。
- **闭包**：内嵌函数能够记住外部函数的状态，可以用于创建动态生成的函数或处理特定的任务。

理解返回值与函数嵌套将帮助你写出结构清晰、可扩展的 Python 代码，并提高代码的可维护性和复用性。
