【进阶】生成器与迭代器的高级用法
发布时间: 2024-06-28 23:17:08 阅读量: 78 订阅数: 131
![【进阶】生成器与迭代器的高级用法](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4038c22aab8c430f9611fe616347a03b~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp)
# 1. 生成器与迭代器的基础概念
生成器和迭代器是 Python 中用于创建和遍历序列的两种强大工具。它们提供了对序列元素的有效访问和控制,并允许在不创建整个序列的情况下逐个生成元素。
**生成器**是一种可暂停的函数,它使用 `yield` 语句生成序列元素。生成器函数在每次调用 `yield` 时都会暂停执行,并返回当前生成的元素。调用方可以通过迭代生成器对象来获取后续元素。
**迭代器**是一个对象,它实现了 Python 中的迭代器协议。迭代器对象提供了一个 `__next__()` 方法,用于返回序列中的下一个元素。当没有更多元素时,`__next__()` 方法会引发 `StopIteration` 异常。
# 2. 生成器的高级用法
### 2.1 生成器表达式和推导式
#### 2.1.1 生成器表达式的语法和应用场景
生成器表达式是一种简洁的语法,用于创建生成器对象。其语法如下:
```python
(expression for item in iterable if condition)
```
其中:
* `expression`:生成器中要产生的元素。
* `item`:可迭代对象中的元素。
* `iterable`:可迭代对象。
* `condition`:可选的过滤条件。
生成器表达式可以用于各种场景,例如:
* 过滤序列:`[x for x in range(10) if x % 2 == 0]` 生成偶数列表。
* 映射序列:`[x * 2 for x in range(10)]` 生成每个元素乘以 2 的列表。
* 嵌套循环:`[(x, y) for x in range(3) for y in range(4)]` 生成笛卡尔积。
#### 2.1.2 推导式的语法和与生成器表达式的区别
推导式是生成器表达式的语法糖,其语法如下:
```python
{expression for item in iterable if condition}
```
推导式与生成器表达式的区别在于:
* 推导式生成集合,而生成器表达式生成生成器。
* 推导式中的元素是唯一的,而生成器表达式中的元素可以重复。
### 2.2 生成器函数的 yield 语句
#### 2.2.1 yield 语句的语法和作用
`yield` 语句是生成器函数中用于生成元素的关键语法。其语法如下:
```python
def generator_function():
...
yield expression
...
```
`yield` 语句将暂停生成器函数的执行,并返回 `expression` 的值。当生成器被调用时,它会逐个生成元素,直到遇到 `StopIteration` 异常。
#### 2.2.2 生成器函数的暂停和恢复执行
生成器函数可以被暂停和恢复执行。当调用生成器时,它会返回一个生成器对象。每次调用生成器对象的 `next()` 方法时,它都会生成一个元素并恢复执行。当生成器函数遇到 `StopIteration` 异常时,`next()` 方法会抛出该异常,表示生成器已完成。
### 2.3 生成器函数的委托和组合
#### 2.3.1 生成器函数的委托机制
生成器函数可以委托另一个生成器函数来生成元素。这可以通过 `yield from` 语句实现,其语法如下:
```python
def generator_function():
...
yield from other_generator_function()
...
```
`yield from` 语句将暂停当前生成器函数的执行,并委托 `other_generator_function` 生成元素。
#### 2.3.2 生成器函数的组合和管道操作
生成器函数可以组合起来形成管道。这可以通过将一个生成器函数的输出作为另一个生成器函数的输入来实现。例如:
```python
def generator1():
...
yield 1
yield 2
yield 3
def generator2():
...
for item in generator1():
yield item * 2
```
`generator2` 将生成 `generator1` 的元素的平方。
# 3. 迭代器的高级用法
### 3.1 迭代器协议和可迭代对象
#### 3.1.1 迭代器协议的定义和实现
迭代器协议定义了迭代器对象的行为,它是一个包含 `__iter__()` 和 `__next__()` 方法的类。`__iter__()` 方法返回迭代器对象本身,而 `__next__()` 方法返回迭代器中的下一个元素。
```python
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
item = self.data[self.index]
self.index += 1
return item
else:
raise StopIteration
```
#### 3.1.2 可迭代对象的概念和类型
可迭代对象是实现了迭代器协议的对象,它可以被 `for` 循环遍历。可迭代对象的类型包括:
- **列表、元组、集合、字典** 等内置数据结构
- **生
0
0