Python 中的**生成器(generator)**是一种可以“边生成边使用”的可迭代对象,常用于处理大量数据或无限序列,节省内存。
下面从基本用法 → 常见写法 → 实际例子一步步说明。
普通函数用 return 返回结果并结束
生成器函数用 yield 返回值,并“暂停”函数状态
def my_gen():
yield 1
yield 2
yield 3
调用它不会立即执行:
g = my_gen()
它是一个生成器对象:
print(g) # <generator object my_gen at 0x...>
生成器只能迭代一次
for i in g:
print(i)
输出:
1
2
3
或用 next():
g = my_gen()
print(next(g)) # 1
print(next(g)) # 2
print(next(g)) # 3
# print(next(g)) # StopIteration
✅ 惰性计算(用的时候才生成)
✅ 节省内存
✅ 可表示无限序列
def count_up(n):
i = 1
while i <= n:
yield i
i += 1
for x in count_up(5):
print(x)
类似列表推导,但用 ()
gen = (x*x for x in range(5))
for v in gen:
print(v)
对比:
list_comp = [x*x for x in range(5)] # 立即生成
gen_exp = (x*x for x in range(5)) # 延迟生成
避免一次性读入内存:
def read_lines(path):
with open(path, encoding="utf-8") as f:
for line in f:
yield line.strip()
for line in read_lines("big.txt"):
print(line)
def infinite_numbers():
n = 0
while True:
yield n
n += 1
g = infinite_numbers()
print(next(g)) # 0
print(next(g)) # 1
| 对比项 | 列表 | 生成器 |
|---|---|---|
| 内存 | 大 | 小 |
| 速度 | 快(已生成) | 慢一点(即时) |
| 可否重用 | 可以 | 不可以 |
| 适用 | 小数据 | 大数据 / 流式 |
yield fromdef sub_gen():
yield 1
yield 2
def main_gen():
yield from sub_gen()
yield 3
for x in main_gen():
print(x)
如果你愿意,我可以:
你更想了解哪一部分?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。