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 程序

相关推荐
love530love2 小时前
LiveTalking 数字人项目 Windows 部署完全指南(EPGF 架构)
人工智能·windows·python·架构·livetalking·epgf
遇事不決洛必達2 小时前
【Python基础】GIL 锁是什么及其对爬虫的影响
爬虫·python·线程·进程·gil锁
星辰徐哥2 小时前
Spring Boot 微服务架构设计与实现
spring boot·后端·微服务
星辰徐哥2 小时前
Spring Boot 数据导入导出与报表生成
spring boot·后端·ui
明夜之约2 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee2 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Micro麦可乐2 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
Jinkxs2 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
毕设源码_郑学姐2 小时前
计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
spring boot·后端·课程设计
辣机小司2 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录