Python 中yield

在 Python 中,yield 是一个关键字,用于定义生成器函数。生成器是一种特殊的迭代器,它允许你逐个生成值,而不是一次性生成所有值并存储在内存中。这使得生成器在处理大量数据或无限序列时非常高效。

1. 基本概念

生成器函数与普通函数的主要区别在于,生成器函数使用 yield 返回值,而不是使用 return。每次调用生成器函数时,它会从上次暂停的地方继续执行,而不是从头开始。

2. 简单示例

以下是一个简单的生成器示例,用于生成从 0 到指定数字的整数序列:

def simple_generator(n):
    for i in range(n):
        yield i

# 使用生成器
gen = simple_generator(5)
print(next(gen))  # 输出 0
print(next(gen))  # 输出 1
print(next(gen))  # 输出 2
print(next(gen))  # 输出 3
print(next(gen))  # 输出 4
# 如果继续调用 next(gen),会抛出 StopIteration 异常

3. 生成器的迭代

生成器可以像普通迭代器一样被迭代。以下是一个使用 for 循环的示例:

def simple_generator(n):
    for i in range(n):
        yield i

# 使用 for 循环迭代生成器
for num in simple_generator(5):
    print(num)  # 输出 0, 1, 2, 3, 4

4. 生成器的内存优势

生成器的一个重要特性是它不会一次性将所有值存储在内存中。这使得生成器在处理大量数据时非常高效。以下是一个对比示例:

# 使用列表存储大量数据
def large_list(n):
    return [i for i in range(n)]

# 使用生成器生成大量数据
def large_generator(n):
    for i in range(n):
        yield i

# 测试内存使用
import sys
n = 1000000
print(sys.getsizeof(large_list(n)))  # 输出约 8MB
print(sys.getsizeof(large_generator(n)))  # 输出约 112 字节

5. 生成器的高级用法

生成器不仅可以生成简单的序列,还可以用于更复杂的任务,例如文件读取、数据处理等。以下是一个从文件中逐行读取内容的生成器示例:

def read_file(filename):
    with open(filename, 'r') as file:
        for line in file:
            yield line.strip()

# 使用生成器读取文件
for line in read_file('example.txt'):
    print(line)

6. 带有条件的生成器

生成器也可以在生成值时添加条件。以下是一个生成偶数的生成器示例:

def even_generator(n):
    for i in range(n):
        if i % 2 == 0:
            yield i

# 使用生成器
for num in even_generator(10):
    print(num)  # 输出 0, 2, 4, 6, 8

7. 生成器表达式

生成器表达式是生成器的更简洁形式,类似于列表推导式。以下是一个生成器表达式的示例:

# 生成器表达式
gen_expr = (i for i in range(10) if i % 2 == 0)

# 使用生成器表达式
for num in gen_expr:
    print(num)  # 输出 0, 2, 4, 6, 8

8. 生成器的 send() 方法

生成器不仅可以生成值,还可以接收值。通过 send() 方法,可以在生成器中传递值。以下是一个示例:

def echo():
    while True:
        received = yield
        print(f"Received: {received}")

# 使用 send() 方法
gen = echo()
next(gen)  # 启动生成器
gen.send("Hello")  # 输出 Received: Hello
gen.send("World")  # 输出 Received: World

9. 生成器的 close() 方法

生成器可以通过 close() 方法提前关闭。以下是一个示例:

def simple_generator():
    for i in range(10):
        yield i

gen = simple_generator()
for num in gen:
    print(num)
    if num == 5:
        gen.close()  # 提前关闭生成器

10. 总结

  • yield 用于定义生成器函数。
  • 生成器逐个生成值,不会一次性占用大量内存。
  • 生成器可以通过 next()for 循环等方式迭代。
  • 生成器可以使用 send() 方法接收值,使用 close() 方法关闭。
  • 生成器表达式是生成器的简洁形式。

生成器是 Python 中非常强大的工具,尤其适用于处理大量数据或需要延迟计算的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值