# lambda(匿名函数)和闭包的关系与区别？

在 Python 中，**`lambda` 函数**和\*\*闭包（closure）\*\*都是涉及函数的概念，它们可以在某些场景中结合使用，但两者本质上是不同的概念。让我们看看它们各自的定义、用法，以及它们之间的关系与区别。

#### 1. **`lambda` 函数**

**`lambda`** 是一种匿名函数，它定义简单，通常用于创建小而短的函数。`lambda` 函数可以接受任意数量的参数，但只能包含一个表达式。其语法非常简洁，适合在不需要明确命名函数的场合使用。

**语法：**

```python
lambda parameters: expression
```

**示例：**

```python
add = lambda x, y: x + y
print(add(3, 5))  # 输出：8
```

* **特点**：
  * 没有函数名（匿名）。
  * 只能包含一个表达式，不能包含复杂的逻辑或多行代码。
  * 通常用于简化代码，比如在函数式编程场景中作为高阶函数的参数（如 `map()`, `filter()`）。

#### 2. **闭包（Closure）**

**闭包** 是指函数内部定义的函数引用了外部函数中的变量，即使外部函数执行完毕，内部函数依然可以访问这些变量。闭包的作用是将外部函数的作用域“封闭”在内部函数中，延长这些变量的生命周期。

**示例：**

```python
def outer(x):
    def inner(y):
        return x + y
    return inner

closure = outer(10)
print(closure(5))  # 输出：15
```

在这个例子中，函数 `inner()` 是闭包，因为它引用了外部函数 `outer()` 中的变量 `x`。即使 `outer()` 执行完毕并退出，`x` 仍然可以在 `inner()` 中被访问。

* **特点**：
  * 闭包可以保持对外部函数中变量的引用，即使外部函数已经返回。
  * 常用于工厂函数、延迟计算或保持状态。

#### 3. **`lambda` 函数与闭包的关系**

**`lambda` 函数** 可以作为 **闭包** 使用，因为它同样可以捕获外部作用域中的变量，形成闭包。换句话说，<mark style="color:red;">**`lambda`**</mark><mark style="color:red;">**&#x20;**</mark><mark style="color:red;">**函数可以是一个匿名的闭包**</mark>。

**示例：`lambda` 函数作为闭包**

```python
def make_multiplier(x):
    return lambda y: x * y

double = make_multiplier(2)
print(double(5))  # 输出：10
```

在这个例子中，`lambda y: x * y` 就是一个闭包，它捕获了外部函数 `make_multiplier()` 中的变量 `x`，即使外部函数执行完毕后，`lambda` 依然能够访问 `x`。

#### 4. **区别**

尽管 `lambda` 函数和闭包可以结合使用，它们在概念上还是有一些区别的：

| **特性**   | **`lambda` 函数**     | **闭包（Closure）**              |
| -------- | ------------------- | ---------------------------- |
| **定义**   | 匿名函数，用于定义简单的单表达式函数。 | 一个函数，可以捕获和引用外部作用域中的变量。       |
| **复杂性**  | 只能包含一个表达式，不能有复杂的逻辑。 | 可以是任意复杂的函数，包含多行代码和逻辑。        |
| **返回值**  | 返回单一表达式的结果。         | 返回一个内部函数，可以访问外部函数的变量。        |
| **典型用途** | 用于简化代码，通常在高阶函数中使用。  | 用于工厂函数、延迟执行或保持状态。            |
| **命名**   | 没有函数名（匿名）。          | 可以是命名或匿名函数（`lambda` 也可以是闭包）。 |
| **语法**   | 简洁的 `lambda` 表达式。   | 通常是嵌套函数，有完整的 `def` 结构。       |

#### 5. **示例：`lambda` 和普通闭包的对比**

**(1) `lambda` 作为闭包**

```python
def outer(x):
    return lambda y: x + y

closure = outer(10)
print(closure(5))  # 输出：15
```

**(2) 普通闭包**

```python
def outer(x):
    def inner(y):
        return x + y
    return inner

closure = outer(10)
print(closure(5))  # 输出：15
```

这两个例子都实现了闭包行为，捕获了外部函数的变量 `x`。但第一个例子使用了 `lambda` 作为闭包，代码更简洁，而第二个例子使用了命名的内部函数 `inner`。

#### 总结：

* **`lambda` 函数** 是 Python 中用于定义简单匿名函数的一种方式，它可以与闭包结合使用。
* **闭包** 是函数内部的函数引用外部函数的变量，即使外部函数返回后，这些引用仍然有效。
* 两者可以一起使用，但 `lambda` 函数主要用于简化代码，而闭包通常用于保存状态或延迟执行。

## 小结：

1、lambda是简单的匿名函数

2、闭包是获取外部变量的一个概念。 也就是闭包内部可以是匿名函数也可以是具名函数。
