本文将系统讲解迭代器与生成器的原理与实战应用


一 可迭代对象与迭代器的概念

在 Python 中 能够使用 for ... in ... 遍历的对象都被称为 可迭代对象 例如 列表 字符串 元组 字典 集合等

numbers = [1, 2, 3]
for n in numbers:
    print(n)

在执行循环时 Python 会在内部把列表转化为一个 迭代器对象 然后通过迭代器逐个取出数据

迭代器是一个可以被 next() 函数调用并返回下一个元素的对象 每次调用 next() 时 迭代器都会记住当前位置 直到元素被取尽 抛出 StopIteration 异常


二 可迭代对象与迭代器的区别

类型特征举例
可迭代对象实现了 __iter__() 方法list dict set str
迭代器对象同时实现了 __iter__()__next__() 方法iter() 创建的对象

一个简单例子

numbers = [1, 2, 3]
it = iter(numbers)  # 创建迭代器对象

print(next(it))  # 输出 1
print(next(it))  # 输出 2
print(next(it))  # 输出 3
# print(next(it))  # StopIteration 异常

iter() 函数用于将可迭代对象转化为迭代器 next() 用于从迭代器中取值


三 自定义迭代器

我们也可以自定义一个迭代器对象

class Counter:
    def __init__(self, start, end):
        self.current = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.current <= self.end:
            value = self.current
            self.current += 1
            return value
        else:
            raise StopIteration

for num in Counter(1, 5):
    print(num)

输出

1
2
3
4
5

这个例子中 __iter__() 返回迭代器本身 __next__() 返回下一个值 当没有更多内容时抛出 StopIteration


四 生成器的概念

生成器是 Python 提供的一种更优雅的创建迭代器的方式 它可以在不一次性占用大量内存的情况下 按需生成数据

生成器的本质是一种特殊的迭代器 通过 yield 关键字 定义函数即可创建生成器


五 创建生成器的两种方式

1 使用 yield 定义生成器函数

def count_down(n):
    print("开始倒计时")
    while n > 0:
        yield n
        n -= 1

for num in count_down(5):
    print(num)

执行结果

开始倒计时
5
4
3
2
1

当函数中使用 yield 时 它不再是普通函数 而是生成器 每次调用 next() 或被 for 循环调用时 执行到 yield 处暂停 并返回当前值


2 使用生成器表达式

生成器表达式的语法与列表推导式类似 但使用小括号

squares = (x * x for x in range(5))
for s in squares:
    print(s)

输出

0
1
4
9
16

相比列表推导式 生成器不会一次性生成所有数据 而是每次按需计算下一个结果 节省大量内存


六 生成器与 return 的区别

  • return 会结束函数并返回一个值
  • yield 会暂停函数执行 并返回一个值 下次恢复执行

生成器函数可以多次返回中间结果 而不是一次性返回所有内容


七 send 方法与生成器通信

生成器还可以使用 send() 方法向内部发送数据 下面是一个简单的例子

def greeter():
    name = yield "请输入你的名字"
    yield f"你好 {name}"

g = greeter()
print(next(g))          # 输出 请输入你的名字
print(g.send("Alice"))  # 输出 你好 Alice

这个特性在协程与异步编程中非常有用


八 实战 案例 用生成器读取大文件

当文件非常大时 一次性读取会占用大量内存 生成器可以按行读取 提高性能

def read_file(filename):
    with open(filename, "r", encoding="utf-8") as f:
        for line in f:
            yield line.strip()

for line in read_file("data.txt"):
    print(line)

这种按需读取方式在日志分析 数据处理等场景中非常常见


九 小结

迭代器和生成器是 Python 高效处理数据的重要机制 它们让我们可以用更少的内存处理大量数据

学习要点

  • 可迭代对象是能被 for 遍历的对象
  • 迭代器实现了 __iter__()__next__() 方法
  • yield 可让函数变为生成器 实现惰性计算
  • 生成器表达式比列表推导式更节省内存
  • 在数据流和文件处理场景中非常实用

掌握迭代器与生成器 你就能写出更优雅更高效的 Python 程序

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]