首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python 生成器

Python 生成器

作者头像
YaoQi
发布2025-11-13 17:45:45
发布2025-11-13 17:45:45
990
举报

什么是生成器?

生成器是 Python 中一种特殊的迭代器,它按需生成值,而不是一次性生成所有值。生成器使用 yield 关键字来返回值,并在每次产生值后暂停执行,等待下一次请求。

生成器的创建方式

1. 生成器函数(使用 yield

代码语言:javascript
复制
def my_generator():
    yield 1
    yield 2
    yield 3
# 使用生成器
gen = my_generator()
print(next(gen))  # 输出: 1
print(next(gen))  # 输出: 2
print(next(gen))  # 输出: 3

2. 生成器表达式

代码语言:javascript
复制
# 类似于列表推导式,但使用圆括号
gen_expr = (x * x for x in range(5))
for value in gen_expr:
    print(value)  # 输出: 0, 1, 4, 9, 16

3. 生成器委托(Python 3.3+)

用 yield from 把生成内容的活委托给别人

代码语言:javascript
复制
def generator_chain():
    """生成器委托"""
    yield from range(3)
    yield from ['a', 'b', 'c']
    yield from (x * 2 for x in range(2))

for item in generator_chain():
    print(item)  # 输出: 0,1,2,a,b,c,0,2

生成器的核心优势

🚀 1. 内存效率极高

列表VS生成器

代码语言:javascript
复制
import sys

# 方式1:使用列表(占用大量内存)
def get_numbers_list(n):
    numbers = []
    for i in range(n):
        numbers.append(i)
    return numbers

# 方式2:使用生成器(几乎不占内存)
def get_numbers_generator(n):
    for i in range(n):
        yield i

# 内存占用对比
n = 1000000
list_memory = sys.getsizeof(get_numbers_list(n))
gen_memory = sys.getsizeof(get_numbers_generator(n))

print(f"列表占用内存: {list_memory} 字节")  # 约 8.5MB
print(f"生成器占用内存: {gen_memory} 字节")  # 仅 128 字节

⏳ 2. 惰性求值(按需计算)

代码语言:javascript
复制
def fibonacci_infinite():
    """无限斐波那契数列生成器"""
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

# 只计算需要的值,不会无限循环
fib = fibonacci_infinite()
for i, num in enumerate(fib):
    if i >= 10:  # 只取前10个
        break
    print(num)  # 输出: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34

🔄 3. 处理大数据流和无限序列

代码语言:javascript
复制
def read_large_file(file_path):
    """逐行读取大文件,不加载到内存"""
    with open(file_path, 'r') as file:
        for line in file:
            yield line.strip()

# 处理GB级别的文件
for line in read_large_file('huge_file.txt'):
    process_line(line)  # 一次只处理一行

🛠️ 4. 状态保持和恢复

代码语言:javascript
复制
def stateful_generator():
    total = 0
    while True:
        value = yield total
        if value is None:
            break
        total += value

# 生成器保持内部状态
calculator = stateful_generator()
next(calculator)  # 启动生成器

print(calculator.send(5))   # 输出: 5
print(calculator.send(10))  # 输出: 15
print(calculator.send(3))   # 输出: 18

应用场景

1. 数据处理管道

代码语言:javascript
复制
def read_data():
    """数据读取阶段"""
    for i in range(10):
        yield i

def filter_even(numbers):
    """过滤阶段"""
    for num in numbers:
        if num % 2 == 0:
            yield num

def square(numbers):
    """转换阶段"""
    for num in numbers:
        yield num * num

# 构建数据处理管道
pipeline = square(filter_even(read_data()))
for result in pipeline:
    print(result)  # 输出: 0, 4, 16, 36, 64

2. 分页处理

代码语言:javascript
复制
def paginate_data(total_items, page_size):
    """分页生成器"""
    page = 0
    while page * page_size < total_items:
        start = page * page_size
        end = start + page_size
        yield (start, end)
        page += 1

# 模拟分页处理数据
for start, end in paginate_data(100, 10):
    print(f"处理第 {start}-{end} 条数据")

3. 实时数据流

代码语言:javascript
复制
import time
import random

def sensor_data_stream():
    """模拟传感器数据流"""
    while True:
        yield {
            'timestamp': time.time(),
            'temperature': random.uniform(20, 30),
            'humidity': random.uniform(40, 80)
        }
        time.sleep(1)  # 每秒产生一个数据点

# 处理实时数据
for data in sensor_data_stream():
    print(f"温度: {data['temperature']:.1f}°C")
    if data['temperature'] > 28:
        print("警告: 温度过高!")

4. 其他

代码语言:javascript
复制
# 计算平方和,不创建中间列表
sum_of_squares = sum(x*x for x in range(1000000))

# 文件行数统计
line_count = sum(1 for line in open('file.txt'))

总结

生成器的核心价值:

  1. 🎯 内存高效 - 处理海量数据不爆内存
  2. ⚡ 惰性计算 - 只在需要时计算,提高性能
  3. 🔄 状态保持 - 自动保存执行状态,简化代码
  4. 🔗 管道处理 - 轻松构建数据处理流水线
  5. ∞ 无限序列 - 表示理论上无限的数据流

生成器是 Python 函数式编程和数据处理的重要工具,特别适合处理大数据集实时数据流复杂的数据转换管道

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 漫跑的小兔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是生成器?
  • 生成器的创建方式
    • 1. 生成器函数(使用 yield)
    • 2. 生成器表达式
    • 3. 生成器委托(Python 3.3+)
    • 用 yield from 把生成内容的活委托给别人
  • 生成器的核心优势
    • 🚀 1. 内存效率极高
    • 列表VS生成器
    • ⏳ 2. 惰性求值(按需计算)
    • 🔄 3. 处理大数据流和无限序列
    • 🛠️ 4. 状态保持和恢复
  • 应用场景
    • 1. 数据处理管道
    • 2. 分页处理
    • 3. 实时数据流
    • 4. 其他
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档