# 列表推导式与生成式

URL: https://caijiao.org/python/ch03/comprehension
Source: docs/python/ch03/comprehension.md
Description: 本章节将介绍 Python 中的列表推导式与生成式，它们是创建列表和生成器对象的简洁高效方式，能够大幅提高代码的可读性和执行效率。

列表推导式和生成式是 [Python](/python/) 中强大的语法特性，它们使得我们能够以简洁的方式生成列表和其他可迭代对象，避免了冗长的代码结构。

## 列表推导式

列表推导式是一种从其他可迭代对象（如列表、元组、字典等）创建新列表的简洁方式。它的基本语法是：

```python
[expression for item in iterable if condition]
```

### 示例：

```python
# 从 0 到 9 中筛选出偶数并平方
numbers = [x**2 for x in range(10) if x % 2 == 0]
print(numbers)
```

输出：

```
[0, 4, 16, 36, 64]
```

在上面的例子中，列表推导式首先从 `range(10)` 中选择偶数（通过 `if x % 2 == 0`），然后对选中的偶数进行平方运算。

### 带有多个 `for` 子句的列表推导式：

```python
# 生成一个 3x3 的矩阵
matrix = [[row * col for col in range(3)] for row in range(3)]
print(matrix)
```

输出：

```
[[0, 0, 0], [0, 1, 2], [0, 2, 4]]
```

## 生成式

生成式与列表推导式非常相似，但是它返回的是一个生成器对象，而不是列表。生成器是惰性计算的，只有在需要的时候才会计算出结果，具有更高的内存效率。

生成器的基本语法是：

```python
(expression for item in iterable if condition)
```

### 示例：

```python
# 从 0 到 9 中筛选出偶数并生成其平方
gen = (x**2 for x in range(10) if x % 2 == 0)
print(gen)
```

输出：

```
<generator object <genexpr> at 0x0000000A1D2A58C0>
```

虽然 `gen` 是一个生成器对象，但它本身不会立即计算出结果。你可以通过 `for` 循环或将其转换为列表来获取结果：

```python
for value in gen:
    print(value)
```

输出：

```
0
4
16
36
64
```

或使用 `list()` 将其转换为列表：

```python
gen = (x**2 for x in range(10) if x % 2 == 0)
print(list(gen))
```

输出：

```
[0, 4, 16, 36, 64]
```

## 列表推导式与生成式的比较

| 特性     | 列表推导式                          | 生成式                                   |
| -------- | ----------------------------------- | ---------------------------------------- |
| 输出类型 | 列表                                | 生成器对象                               |
| 内存效率 | 较低，生成完整列表                  | 较高，仅在需要时计算生成元素             |
| 适用场景 | 当需要一个完整的列表时              | 当数据量较大且不需要一次性生成完整数据时 |
| 语法     | `[expression for item in iterable]` | `(expression for item in iterable)`      |

## 总结

- 列表推导式是一种简洁的方式来创建列表，可以在单行代码中处理复杂的操作。
- 生成式与列表推导式相似，但返回一个惰性计算的生成器对象，适用于处理大量数据时。
- 通过掌握列表推导式与生成式，你可以写出更加高效、简洁且可读性强的 Python 代码。

列表推导式和生成式都是 Python 编程中非常重要的技巧，能够帮助你在不同场景下提高代码的执行效率和可读性。

---

这段内容介绍了 Python 中的列表推导式和生成式，解释了它们的基本语法、使用场景以及内存效率的对比，并通过示例演示了如何在实际应用中使用它们。
