> 送给自己一句话: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` 或圆括号创建,省内存、处理大数据流神器**