3.5 Python3 生成器

目录

1. 什么是生成器?

2. 关键字 yield

3. 生成器表达式

4. 使用场景

5. 生成器 vs 迭代器


1. 什么是生成器?

        生成器是一种特殊的迭代器,它使用yield关键字而不是return来返回值。生成器函数在每次调用next()时执行,直到遇到yield语句暂停并返回一个值,下次调用时从暂停的位置继续执行


2. 关键字 yield

yield关键字用于定义生成器函数:

def my_generator():
    yield 1
    yield 2
    yield 3

# 创建生成器对象
gen = my_generator()

# 使用生成器
print(next(gen))  # 输出: 1
print(next(gen))  # 输出: 2
print(next(gen))  # 输出: 3

3. 生成器表达式

类似于列表推导式,但使用圆括号:

# 列表推导式 - 立即计算
squares_list = [x**2 for x in range(5)]  # [0, 1, 4, 9, 16]

# 生成器表达式 - 延迟计算
squares_gen = (x**2 for x in range(5))  # 生成器对象

print(list(squares_gen))  # 转换为列表: [0, 1, 4, 9, 16]

4. 使用场景

  1. 处理大数据集(节省内存)

    def read_large_file(file_path):
        with open(file_path) as f:
            for line in f:
                yield line
    
    # 逐行处理大文件,不一次性加载到内存
    for line in read_large_file('huge_file.txt'):
        process(line)
  2. 无限序列

    def infinite_sequence():
        num = 0
        while True:
            yield num
            num += 1
    
    # 生成无限序列
    for i in infinite_sequence():
        if i > 100:  # 需要手动终止
            break
        print(i)
  3. 管道数据处理(链式处理)

    def gen_numbers():
        for i in range(10):
            yield i
    
    def gen_squares(nums):
        for num in nums:
            yield num**2
    
    # 链式处理
    squares = gen_squares(gen_numbers())
    print(list(squares))  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  4. 状态保持(比类更简洁)

    def counter(start=0):
        count = start
        while True:
            val = (yield count)
            if val is not None:  # 可以通过send()修改状态
                count = val
            else:
                count += 1
    
    c = counter(10)
    print(next(c))  # 10
    print(next(c))  # 11
    c.send(20)      # 修改状态
    print(next(c))  # 21
  5. 协程和异步编程(基础)

    def coroutine():
        print("Starting")
        while True:
            value = (yield)
            print(f"Received: {value}")
    
    co = coroutine()
    next(co)       # 启动协程
    co.send("Hello")  # Received: Hello
    co.send("World")  # Received: World


5. 生成器 vs 迭代器

特性生成器迭代器
实现方式使用yield的函数实现__iter____next__的类
内存使用更节省内存相对占用更多内存
代码简洁性更简洁需要更多代码
状态保持自动保存局部变量状态需要手动管理状态

生成器是Python中非常强大的工具,特别适合处理大数据流、实现惰性计算和创建复杂的迭代模式。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值