当前位置:首页>python>python-生成器

python-生成器

  • 2026-09-02 19:17:28
python-生成器

> 送给自己一句话:Python 不难,难的是坚持;编程不难,难的是动手,祝你早日学成 Python,实现自己的目标

*学习的脚步不要停歇,因为时代在进步我们更要进步,学到老活到老。希望能和大家共同成长,也希望有任何问题,大家评论、私信,一起交流进步

一个上进心极强的入门小白,虽然之前的文章总是更新着会断更,但是我相信这次我能把python这门语言能啃下来

如果超过两天断更了,更幸运的是你看到了这里,希望能够在最后一篇文章的评论区去催更,在这里感谢你的催更*

> 点赞评论催更是我更新的最大动力!这样是代表着我被人看到了。

---

# Python 生成器(Generator):最省内存的“懒加载”迭代器

一句话核心:**生成器是一种特殊的迭代器,不会一次性生成所有数据,而是“用一个生成一个”,极大节省内存**。

---

## 一、为什么需要生成器?(对比列表)

列表是“一次性全生成”:

```python# 列表:直接生成100万个数字,占大量内存big_list = [x for x in range(1000000)]```

生成器是“用一个生成一个”:

```python# 生成器:几乎不占内存,用的时候才生成big_generator = (x for x in range(1000000))```

---

## 二、两种创建方式

### 1. 用 `yield` 关键字(生成器函数)

普通函数用 `return` 返回值,生成器函数用 `yield`,**每次 `yield` 会暂停函数并保存状态**。

```pythondef count_to_3():    yield 1    yield 2    yield 3# 创建生成器对象gen = count_to_3()# 用 next() 逐个获取值print(next(gen))  # 输出 1print(next(gen))  # 输出 2print(next(gen))  # 输出 3# print(next(gen))  # 报错 StopIteration```

### 2. 生成器表达式(类似列表推导式,用圆括号)

```python# 列表推导式(方括号)list_comp = [x*2 for x in range(5)]  # [0,2,4,6,8]# 生成器表达式(圆括号)gen_comp = (x*2 for x in range(5))   # <generator object>```

---

## 三、核心工作原理

1. **调用生成器函数** → 不执行代码,返回生成器对象

2. **调用 `next(生成器)`** → 执行到 `yield`,返回值,**暂停**

3. **再次调用 `next()`** → 从暂停处继续执行,直到下一个 `yield`

4. **没有 `yield` 了** → 抛出 `StopIteration` 异常

---

## 四、生成器的三大优势

✅ **内存极省**:处理百万级数据也只占一点点内存

✅ **惰性计算**:需要的时候才生成,不浪费资源

✅ **状态保存**:每次暂停会记住当前执行位置

---

## 五、最经典应用场景

1. **处理超大文件**:不会一次性把文件读进内存

 ```python   def read_large_file(file_path):       with open(file_path, 'r') as f:           for line in f:               yield line.strip()   ```

2. **无限序列**:比如斐波那契数列,永远生成下去

```python   def fibonacci():       a, b = 0, 1       while True:           yield a           a, b = b, a + b   ```

3. **管道式数据处理**:像流水线一样一步步处理数据

---

## 六、一句话总结

**生成器 = 懒加载的迭代器,用 `yield` 或圆括号创建,省内存、处理大数据流神器**

最新文章

随机文章