告别混淆:迭代器和生成器的区别、实现与实战场景解析

部署运行你感兴趣的模型镜像

目录

一、迭代器

1 什么是迭代器

2 迭代器的创建

3 自定义迭代器

4 迭代器使用场景

二、生成器

1 什么是生成器

2 生成器示例

3 生成器使用场景

三、迭代器与生成器的区别


一、迭代器

1 什么是迭代器

  • 迭代器是 Python 中实现了迭代协议(即包含 __iter__() 和 __next__() 方法)的对象;
  • 用于逐个访问容器中的元素;
  • 其核心特性是惰性计算:仅在需要时才生成下一个元素,而非一次性加载所有数据到内存;
  • 迭代器适合处理大规模数据或无限序列。

迭代器的工作流程如下:

  • 通过 __iter__() 方法返回自身(使对象可迭代)。
  • 通过 __next__() 方法返回下一个元素,当元素耗尽时抛出 StopIteration 异常,终止迭代。

可迭代对象(Iterable)与迭代器不同:

  • 可迭代对象实现 __iter__() 方法,返回一个迭代器。
  • 迭代器既实现 __iter__() 又实现 __next__()

2 迭代器的创建

        转换可迭代对象:使用 iter() 函数将列表、元组、字典等可迭代对象转换为迭代器。

list1 = [2, 34, 56, 3, 43, 4]
print(list1)

# 把list1转换为可迭代对象
iter1 = iter(list1)  # 从list1对象中获取迭代器
print(iter1)

# 到内存里面去拿我要的数据
print(next(iter1))  # 从迭代器中拿取第一个元素
print(next(iter1))  # 执行完到这儿时指针已经指向56

# 继续拿:循环,从指针指向的位置(56)开始循环
for i in iter1:
    print(i)

# 示例:将字符串转换为迭代器
s = "hello"
it = iter(s)
print(next(it))  # 输出:h

3 自定义迭代器

        自定义迭代器需在类中实现 __iter__() 和 __next__() 方法

class CountIterator:
    def __init__(self, start, end):
        self.current = start  # 初始值
        self.end = end        # 终止值

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

    def __next__(self):
        if self.current <= self.end:
            result = self.current
            self.current += 1  # 更新状态
            return result
        else:
            raise StopIteration  # 终止迭代

# 使用自定义迭代器
counter = CountIterator(1, 3)
for num in counter:
    print(num)  # 输出:1、2、3

4 迭代器使用场景

  • 处理大型数据集:如读取大文件时,通过迭代器逐行读取(而非一次性加载整个文件),减少内存占用。
class LogFileIterator:
    def __init__(self, file_path):
        self.file_path = file_path
        self.file_obj = None

    def __iter__(self):
        # 打开文件并返回迭代器自身
        self.file_obj = open(self.file_path, "r", encoding="utf-8")
        return self

    def __next__(self):
        if self.file_obj is None:
            raise StopIteration("File not opened")
        # 读取下一行,文件结束时抛出 StopIteration
        line = self.file_obj.readline()
        if not line:
            self.file_obj.close()  # 关闭文件
            raise StopIteration
        return line.strip()  # 去除行尾换行符


ger = LogFileIterator('00.iree.json')
for i in ger:
    print(i)
  • 遍历自定义数据结构:如链表、树等复杂结构,通过迭代器封装遍历逻辑,简化访问方式。
  • 实现无限序列:如生成无限递增的整数序列(需手动控制终止条件)。

二、生成器

1 什么是生成器

  • 生成器是一种特殊的迭代器,无需手动实现 __iter__() 和 __next__() 方法,而是通过 yield 关键字定义。
  • 其核心特性是状态暂停与恢复:生成器函数执行到 yield 时返回值并暂停,下次调用时从暂停处继续执行。

生成器优势:

  • 代码更简洁,无需手动管理迭代状态。
  • 天然支持惰性计算,内存效率极高。

2 生成器示例

1.1 生成器函数

  • 通过 yield 关键字定义函数,调用时返回生成器对象。
# 死循环
# 用yield返回不会死机,因为是一帧一帧处理的
def my_generator(n):
    i = 0
    while True:
        i += 1
        yield f'{i}画面'
        if i > n:
            break


gen = my_generator(1000)
for i in gen:
    print(i)

1.2 生成器表达式

  • 类似列表推导式,用 () 替代 [],直接创建生成器。
# 生成器表达式:生成1-10的平方
square_generator = (x**2 for x in range(1, 11))
for num in square_generator:
    print(num)  # 输出:1、4、9、...、100

3 生成器使用场景

  • 处理海量数据:如生成 100 万条测试数据时,生成器按需生成,避免占用大量内存。
# 生成器批量生成测试数据
def test_data_generator(size):
    for i in range(size):
        yield {"id": i, "value": f"test_{i}"}

# 按需获取100万条数据
for data in test_data_generator(1000000):
    save_to_db(data)  # 逐条写入数据库
  • 实现协程:利用生成器的暂停 / 恢复特性,实现简单的协程(如异步任务调度)。
  • 管道式数据处理:多步数据处理流程中,用生成器串联各步骤(如数据清洗→转换→输出),减少中间变量存储。

三、迭代器与生成器的区别

对比维度迭代器生成器
实现方式需自定义类,实现 __iter__() 和 __next__()用 yield 函数或生成器表达式,无需手动实现迭代方法
代码复杂度较高(需管理迭代状态)较低(语法简洁,状态自动维护)
内存效率较高(惰性计算)更高(无额外状态存储)
适用场景复杂数据结构遍历、自定义迭代逻辑海量数据处理、简单序列生成、协程
状态控制需手动更新迭代索引(如 self.index自动保存暂停时的状态(变量值、执行位置)
  • 核心区别:生成器是迭代器的 “简化版”,用更简洁的语法实现迭代功能,适合快速开发;迭代器更灵活,适合复杂场景的定制化实现。

注意!!!!!

迭代器和生成器是 Python 中极为关键的概念,在数据处理、性能优化以及代码设计等诸多方面都发挥着重要作用,堪称 Python 编程进阶之路上必须深入掌握的核心知识点。

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值