Python编程实战 面向对象与进阶语法 迭代器与生成器

在 Python 的世界中 迭代是非常核心的概念 无论是 for 循环 遍历列表 还是按需生成大量数据 背后都离不开迭代器与生成器的支持 理解它们不仅能让代码更高效 更优雅 还可以帮助你掌握 Python 内部运行的机制

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


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

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

python 复制代码
numbers = [1, 2, 3]
for n in numbers:
    print(n)

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

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


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

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

一个简单例子

python 复制代码
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() 用于从迭代器中取值


三 自定义迭代器

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

python 复制代码
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 定义生成器函数

python 复制代码
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 使用生成器表达式

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

python 复制代码
squares = (x * x for x in range(5))
for s in squares:
    print(s)

输出

复制代码
0
1
4
9
16

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


六 生成器与 return 的区别

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

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


七 send 方法与生成器通信

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

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

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

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


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

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

python 复制代码
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 程序

相关推荐
Cikiss2 小时前
图解 MySQL JOIN
数据库·后端·mysql
程序员爱钓鱼2 小时前
Python编程实战 面向对象与进阶语法 JSON数据读写
后端·python·ipython
Mintopia2 小时前
🌐 《GraphQL in Next.js 初体验》中文笔记
前端·后端·全栈
爱吃烤鸡翅的酸菜鱼2 小时前
深度解析《AI+Java编程入门》:一本为零基础重构的Java学习路径
java·人工智能·后端·ai
林太白2 小时前
rust12-路由接口
后端·rust
TH88862 小时前
一体化负氧离子监测站:实时、精准监测空气中负氧离子浓度及其他环境参数
python
SimonKing2 小时前
被卖的Hutool出AI模块了!它如何让Java调用大模型变得如此简单?
java·后端·程序员
苏打水com3 小时前
0基础学前端:100天拿offer实战课(第3天)—— CSS基础美化:给网页“精装修”的5大核心技巧
人工智能·python·tensorflow
凌览3 小时前
Node.js + Python 爬虫界的黄金搭档
前端·javascript·后端