它不关心元素是从哪来的——可以是列表、文件、网络流,也可以是实时计算出来的。生成器(Generator):是一种特殊的迭代器,用函数 + yield 或生成器表达式来创建
它们都是生产者,而真正去“消费”数据的,是外部的循环或函数。
1. 生成器(Generator):聪明的“按需生产者”
next()),它才现算一个给你。它把“生产逻辑”和“数据”分开了,所以极其省内存。2. 迭代器(Iterator):广义的“生产者”
3. 消费者(Consumer):真正的吃货
for 循环、sum() 函数、或者 list() 转换。它们不断地调用 next() 列表转成的迭代器(List Iterator)
iter() 函数,比如 iter([1,2,3...])。所以:
1. 从数据集(如列表)里取数据:确实占用大量内存
next() 取出的当前元素。my_list[i] 变成了用 next())2. 从文件读取:内存占用极小(恒定)
for line in open('huge_file.txt')),Python 并不会把整个文件加载到内存里。它底层只维护了一个小缓冲区(通常几 KB 到几十 KB),每次只读一小块,yield 一行,处理完就丢弃,再读下一行。3. 从网络流读取:同理,内存占用极小
1. 生成器(Generator):靠“代码逻辑”生成
yield 或者 () 表达式)。(x for x in range(10))。2. 列表迭代器(List Iterator):靠“内存中的列表”生成
iter([1,2,3]))。iter([1, 2, 3])。3. 文件迭代器(File Iterator):靠“底层C语言代码”生成
open('test.txt'))。next() 时,它底层会去调用操作系统的 API,从硬盘读取数据到内存的小缓冲区里,然后吐出一行。f = open('test.txt'),然后 next(f)。