Python之迭代器、生成器以及yelid关键字使用说明


Python 生成器、迭代器与 yield 详解

在 Python 中,迭代器(Iterator)生成器(Generator)yield 关键字 是处理序列数据的重要工具。它们共同支持惰性计算(按需生成值),优化内存使用,适用于处理大数据或无限流式数据。以下是详细解释及实际场景示例:


一、迭代器(Iterator)

1. 概念
  • 迭代器协议:对象必须实现 __iter__()__next__() 方法。
  • 特性
    • 按需逐个返回元素,不预先生成所有数据。
    • 遍历结束后抛出 StopIteration 异常。
  • 常见迭代器:文件对象、range 对象、生成器。
2. 实现自定义迭代器
class FibonacciIterator:
    def __init__(self, max_count):
        self.max_count = max_count
        self.a, self.b = 0, 1
        self.count = 0

    def __iter__(self):
        return self  # 返回迭代器自身

    def __next__(self):
        if self.count >= self.max_count:
            raise StopIteration
        result = self.a
        self.a, self.b = self.b, self.a + self.b
        self.count += 1
        return result

# 使用示例
fib_iter = FibonacciIterator(5)
for num in fib_iter:
    print(num)  # 输出:0, 1, 1, 2, 3
3. 场景:逐行读取大文件
class FileLineIterator:
    def __init__(self, filename):
        self.file = open(filename, 'r')

    def __iter__(self):
        return self

    def __next__(self):
        line = self.file.readline()
        if not line:
            self.file.close()
            raise StopIteration
        return line.strip()

# 逐行读取文件,避免一次性加载到内存
for line in FileLineIterator("large_log.txt"):
    process_line(line)

二、生成器(Generator)

1. 概念
  • 生成器是简化版的迭代器,无需显式定义 __iter____next__
  • 生成器函数:使用 yield 关键字返回值的函数,调用时返回生成器对象。
  • 生成器表达式:类似列表推导式,语法为 (expr for item in iterable)
2. 生成器的优势
  • 代码简洁:无需定义类,直接通过函数实现。
  • 内存高效:按需生成值,适合处理大型数据集或无限序列。
3. 实现生成器函数
def fibonacci_generator(max_count):
    a, b, count = 0, 1, 0
    while count < max_count:
        yield a
        a, b = b, a + b
        count += 1

# 使用示例
for num in fibonacci_generator(5):
    print(num)  # 输出:0, 1, 1, 2, 3
4. 生成器表达式
# 生成器表达式:惰性计算平方数
squares = (x**2 for x in range(10))
print(next(squares))  # 输出:0
print(next(squares))  # 输出:1

三、yield 关键字

1. 核心机制
  • 暂停与恢复:当函数执行到 yield 时,返回一个值并冻结函数状态,下次调用时从断点继续执行。
  • 状态保存:局部变量、指令指针等状态会被保留。
2. 场景:流式数据处理
def read_large_file(filename):
    with open(filename, 'r') as file:
        for line in file:
            yield line.strip()  # 逐行生成,不一次性加载内存

# 处理 10GB 日志文件
for line in read_large_file("huge_log.txt"):
    if "ERROR" in line:
        log_error(line)
3. 场景:无限序列生成
def infinite_counter():
    count = 0
    while True:
        yield count
        count += 1

# 生成无限递增整数
counter = infinite_counter()
print(next(counter))  # 0
print(next(counter))  # 1

四、生成器与迭代器的对比

特性 迭代器 生成器
实现方式 类(需定义 __next__ 函数(使用 yield)或表达式
代码复杂度 较高(需手动管理状态) 低(自动状态管理)
内存占用 低(按需生成) 低(与迭代器相同)
适用场景 复杂遍历逻辑 简单惰性计算、大数据处理

五、高级应用:协程与 send()

生成器可通过 send() 接收外部数据,实现协程(Coroutine):

def interactive_generator():
    value = yield "Ready"
    while True:
        value = yield f"Received: {value}"

gen = interactive_generator()
print(next(gen))        # 输出:Ready
print(gen.send("Hello"))# 输出:Received: Hello
print(gen.send(42))     # 输出:Received: 42

六、总结

  • 迭代器:通过类实现遍历逻辑,适合复杂场景。
  • 生成器:简化迭代器创建,适用于大数据或无限序列。
  • yield:生成器的核心关键字,支持惰性计算和状态保留。

实际应用场景

  • 处理大文件:逐行读取日志或 CSV 文件。
  • 生成无限序列:实时数据流(如传感器数据)。
  • 惰性计算:高效处理大规模数据集(如 Pandas 分块读取)。

你可能感兴趣的:(Python,python,开发语言,django,后端,运维开发,经验分享,devops)