生成器 vs 自定义迭代器:__next__方法在实际项目中的最佳实践

第一章:生成器与自定义迭代器的对比概述

在现代编程语言中,处理数据流和集合遍历时,生成器(Generator)与自定义迭代器(Custom Iterator)是两种常见但设计哲学迥异的机制。它们均支持惰性求值,但在实现方式、内存使用和开发复杂度上存在显著差异。

核心机制差异

  • 生成器:基于函数定义,通过 yield 关键字暂停执行并返回中间结果,由运行时自动管理状态。
  • 自定义迭代器:需手动实现迭代协议,如 Python 中的 __iter__() 和 __next__() 方法,或 Go 中的接口约定。

代码实现对比

以生成斐波那契数列为例:
# 生成器实现
def fibonacci_gen():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

# 使用
gen = fibonacci_gen()
for _ in range(5):
    print(next(gen))
# 输出: 0, 1, 1, 2, 3
# 自定义迭代器实现
class FibonacciIter:
    def __init__(self):
        self.a, self.b = 0, 1

    def __iter__(self):
        return self

    def __next__(self):
        current = self.a
        self.a, self.b = self.b, self.a + self.b
        return current

# 使用
fib_iter = FibonacciIter()
for _ in range(5):
    print(next(fib_iter))

性能与适用场景对比

特性生成器自定义迭代器
实现复杂度低高
内存占用极低低
可复用性每次调用创建新生成器可设计为可重置实例
状态管理自动手动
graph TD A[数据源] --> B{选择机制} B --> C[生成器: 简洁、快速] B --> D[自定义迭代器: 灵活、可控] C --> E[适合简单惰性序列] D --> F[适合复杂状态逻辑]

第二章:__next__ 方法的核心机制解析

2.1 __next__ 方法在迭代协议中的角色

在 Python 的迭代协议中,__next__ 方法是构成迭代器的核心组成部分。它定义了如何获取序列中的下一个元素,并在无更多元素时引发 StopIteration 异常。
方法调用机制
当使用 next() 函数驱动迭代器时,Python 会自动调用对象的 __next__ 方法。该方法必须返回当前元素并准备下一次调用状态。
class CountIterator:
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        return self

    def __next__(self):
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1
上述代码中,__next__ 每次返回递增的整数,直到超出上限。逻辑上确保了迭代过程的可控性与终止条件的明确性。
与 __iter__ 的协同
一个对象实现 __next__ 和 __iter__ 后即成为迭代器。两者共同遵循迭代协议,使得该对象能被用于 for 循环、列表推导等上下文中。

2.2 手动实现 __next__ 的基本结构与异常处理

在自定义迭代器时,手动实现 `__next__` 方法是核心步骤。该方法需返回下一个元素,并在耗尽时引发 `StopIteration` 异常以终止迭代。
基本结构
class CountIterator:
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        return self

    def __next__(self):
        if self.current > self.high:
            raise StopIteration
        self.current += 1
        return self.current - 1
上述代码中,__next__ 检查当前值是否超出范围,若超出则抛出 StopIteration,否则返回当前值并递增。
异常处理机制
  • StopIteration 是迭代结束的信号,必须显式抛出;
  • 未捕获的异常会中断循环,因此逻辑判断要精确;
  • 状态管理(如 current)需在调用间保持一致。

2.3 StopIteration 异常的正确触发与捕获

在 Python 的迭代器协议中,StopIteration 异常用于标识迭代的结束。当迭代器没有更多元素时,其 __next__() 方法应显式抛出该异常。
正确触发 StopIteration
class CountIterator:
    def __init__(self, limit):
        self.limit = limit
        self.counter = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.counter >= self.limit:
            raise StopIteration  # 正确触发
        self.counter += 1
        return self.counter - 1
上述代码中,当计数达到上限时,raise StopIteration 被调用,通知解释器迭代终止。
自动捕获机制
Python 在 for 循环中会自动捕获 StopIteration,无需手动处理:
  • for 循环底层通过 iter() 和 next() 实现
  • 遇到 StopIteration 自动退出循环
  • 手动调用 next() 时需使用 try-except 捕获

2.4 状态维护:如何在 __next__ 中管理迭代进度

在实现自定义迭代器时,__next__ 方法不仅要返回当前值,还需精确维护迭代的内部状态,确保每次调用都能推进到下一个有效位置。
状态变量的设计原则
通常使用实例变量(如 self.index 或 self.current)记录进度。这些变量在 __iter__ 中初始化,在 __next__ 中更新。
class Counter:
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        return self

    def __next__(self):
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1
上述代码中,self.current 跟踪当前位置。每次调用 __next__ 时检查是否越界,若未结束则递增并返回前值。这种设计保证了状态的连续性和一致性,是迭代器正确性的核心机制。

2.5 性能考量:__next__ 调用开销与优化建议

在自定义迭代器中,__next__ 方法的调用频率极高,其内部逻辑直接影响整体性能。频繁的异常抛出(如 StopIteration)或复杂计算会显著增加开销。
减少 __next__ 中的冗余操作
避免在 __next__ 中重复创建对象或执行昂贵的计算。应将可复用的逻辑前置至 __iter__ 中初始化。

class OptimizedRange:
    def __init__(self, n):
        self.n = n
        self.i = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.i >= self.n:
            raise StopIteration
        val = self.i
        self.i += 1
        return val
上述实现将计数器 i 初始化在 __init__ 阶段,避免每次调用 __next__ 时重新设置状态,提升执行效率。
使用生成器替代手动迭代器
Python 生成器自动优化了 __next__ 调用机制,适用于大多数数据流场景。
  • 生成器函数天然支持惰性求值
  • 解释器对 yield 表达式做了底层优化
  • 代码更简洁,出错概率更低

第三章:自定义迭代器的实际应用场景

3.1 实现可复用的数据流迭代器

在处理大规模数据流时,构建可复用的迭代器模式能显著提升代码的模块化与可维护性。通过封装数据提取逻辑,可在不同场景下统一访问接口。
核心设计思路
采用接口抽象数据源,使迭代器支持多种后端存储(如文件、数据库、网络流)。关键在于定义统一的 Next() 和 Value() 方法。

type Iterator interface {
    Next() bool
    Value() []byte
    Error() error
    Close() error
}
该接口允许逐条消费数据,Next() 触发加载,Value() 获取当前值,Error() 检查状态,Close() 释放资源。
通用实现示例
基于 channel 构建异步迭代器,适用于流式解析:

func NewChannelIterator(ch <-chan []byte) Iterator {
    iter := &channelIterator{ch: ch}
    go func() {
        close(iter.buffer)
    }()
    return iter
}
此实现将输入通道中的数据逐步推入缓冲区,实现非阻塞读取,适合高吞吐场景。

3.2 结合类属性封装复杂迭代逻辑

在面向对象设计中,将复杂的迭代逻辑封装在类属性中,有助于提升代码的可读性和复用性。通过隐藏内部遍历细节,对外暴露简洁的接口。
封装分页迭代器
class DataPaginator:
    def __init__(self, data, page_size=10):
        self.data = data
        self.page_size = page_size

    def __iter__(self):
        for i in range(0, len(self.data), self.page_size):
            yield self.data[i:i + self.page_size]
该类将分页逻辑封装在__iter__方法中,调用时可通过for page in DataPaginator(data)直接遍历每一页。
优势分析
  • 降低调用方复杂度,无需关心切片逻辑
  • 支持延迟加载,适用于大数据集
  • 可扩展为异步或远程数据分页

3.3 迭代器在资源管理中的实践(如文件、网络流)

在处理外部资源如文件或网络流时,迭代器模式能有效封装资源的访问逻辑,确保资源在使用完毕后被正确释放。
资源安全遍历
通过实现迭代器协议,可在每次获取数据后自动管理缓冲区和连接状态,避免资源泄漏。
func readFileLines(filename string) <-chan string {
    ch := make(chan string)
    go func() {
        file, _ := os.Open(filename)
        defer file.Close()
        scanner := bufio.NewScanner(file)
        for scanner.Scan() {
            ch <- scanner.Text()
        }
        close(ch)
    }()
    return ch
}
该函数返回一个只读通道,模拟迭代器行为。启动 goroutine 逐行读取文件,defer file.Close() 确保文件句柄最终关闭,即使发生错误也能安全释放。
优势对比
  • 延迟加载:按需读取,减少内存占用
  • 统一接口:无论文件或HTTP流,均可使用相同方式消费数据
  • 自动清理:结合 defer 或 finally 实现资源自动回收

第四章:生成器与 __next__ 实现的协同模式

4.1 何时选择生成器而非自定义迭代器

在需要实现简单、按需计算的序列时,生成器通常比自定义迭代器更合适。其语法简洁,由函数配合 yield 表达式即可实现。
代码简洁性对比
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
上述生成器仅需几行代码即可实现无限斐波那契数列,而自定义迭代器需定义类、__iter__ 和 __next__ 方法。
适用场景总结
  • 数据量大或无限序列:避免一次性加载内存
  • 逻辑简单:无需维护复杂状态
  • 一次性遍历:不需要重复使用结果集
当这些条件满足时,生成器是更优选择。

4.2 在类中混合使用生成器方法与 __next__

在 Python 类设计中,可同时实现生成器方法与 `__next__` 协议,以提供灵活的迭代行为。通过将生成器函数与传统的迭代器协议结合,开发者能根据不同场景选择调用方式。
混合模式的设计思路
类可以定义 `__iter__` 和 `__next__` 以支持标准迭代,同时包含其他生成器方法用于复杂数据流处理。

class DataStream:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        value = self.data[self.index]
        self.index += 1
        return value

    def reversed_stream(self):
        for item in reversed(self.data):
            yield item * 2
上述代码中,`__next__` 实现正向逐项访问;而 `reversed_stream` 是一个生成器方法,按逆序返回元素并执行翻倍操作。两者共存使类具备多模式数据输出能力。
  • __next__ 适用于简单、线性遍历场景
  • 生成器方法适合复杂逻辑或多种遍历路径需求

4.3 封装生成器为兼容迭代协议的自定义迭代器

在 Python 中,生成器天然支持迭代协议,但将其封装为显式的自定义迭代器可提升接口清晰度与复用性。通过实现 `__iter__` 和 `__next__` 方法,可将生成器逻辑包装成标准迭代器。
封装示例

def number_generator():
    for i in range(3):
        yield i

class NumberIterator:
    def __init__(self):
        self.generator = number_generator()
    
    def __iter__(self):
        return self
    
    def __next__(self):
        try:
            return next(self.generator)
        except StopIteration:
            raise
上述代码中,`NumberIterator` 封装了生成器函数,`__next__` 通过 `next()` 驱动生成器,抛出 `StopIteration` 以符合迭代协议。
优势分析
  • 统一接口:对外暴露标准迭代器行为
  • 状态管理:可在迭代器中添加额外状态或日志逻辑
  • 兼容性:适用于所有期望迭代器的 API 场景

4.4 典型案例:树结构遍历中的两种实现对比

在树结构的遍历操作中,递归与迭代是两种典型实现方式。递归写法简洁直观,易于理解;而迭代借助栈结构模拟遍历过程,更适合深度较大的树以避免栈溢出。
递归实现
def inorder_recursive(root):
    if root:
        inorder_recursive(root.left)
        print(root.val)
        inorder_recursive(root.right)
该方法通过函数调用栈自动保存上下文,依次处理左子树、根节点和右子树,逻辑清晰,但空间复杂度受树高影响。
迭代实现
def inorder_iterative(root):
    stack, curr = [], root
    while stack or curr:
        while curr:
            stack.append(curr)
            curr = curr.left
        curr = stack.pop()
        print(curr.val)
        curr = curr.right
手动维护栈结构模拟递归过程,时间复杂度为 O(n),空间复杂度更稳定,适用于大规模数据场景。
对比分析
方式代码复杂度空间开销适用场景
递归低高(依赖调用栈)树较浅时
迭代中可控(显式栈)树较深或资源受限

第五章:最佳实践总结与设计建议

合理使用连接池管理数据库资源
在高并发系统中,数据库连接的创建和销毁开销显著。应配置合理的连接池参数,避免资源耗尽或空闲浪费。例如,在 Go 中使用 *sql.DB 时,通过以下方式优化:

db.SetMaxOpenConns(100)
db.SetMaxIdleConns(10)
db.SetConnMaxLifetime(time.Hour)
生产环境中建议结合监控指标动态调整。
服务间通信优先采用异步消息机制
对于非实时依赖的服务调用,推荐使用消息队列解耦。常见场景包括订单处理与库存更新。如下是 RabbitMQ 发送消息的典型结构:
  • 生产者将事件发布到交换机
  • 通过路由键绑定到指定队列
  • 消费者监听队列并处理业务逻辑
  • 处理失败时进入死信队列供人工干预
该模式提升系统容错能力与吞吐量。
统一日志格式便于集中分析
微服务架构下,分散的日志难以追踪。建议采用结构化日志(如 JSON 格式),并包含关键字段:
字段名类型说明
timestampstringISO8601 时间戳
service_namestring服务标识
trace_idstring分布式链路追踪ID
结合 ELK 或 Loki 进行聚合查询,可快速定位跨服务问题。
实施蓝绿部署降低上线风险
流程图:旧版本运行 → 新版本部署并自检 → 流量切换至新版本 → 观察稳定性 → 成功则保留,失败则回退
此策略确保发布过程对用户透明,适用于核心交易系统。
相关-5.python的yield使用(生成器和迭代器) 知道深度学习里经常使用yield来生成batch数据,这次稍微深入调研一下。 主要参考以下大佬: 知乎回答:Python 的关键字 yield 有哪些用法和用途? - 飞鸿的回答 - 知乎 stackoverflow回答:What does the “yield” keyword do? 和上面问题差不多对应的一个中文翻译:3. (译)Python关键字yield的解释(stackoverflow) ✅ 菜鸟教程:Python yield 使用浅析 最标准的,我自己去python官网搜索PEP规范找到 阅读详情

相关推荐

树莓派使用 OLED 屏显示图片及文字

树莓派默认是不带显示屏的,如果想要查看系统的一些信息,需要使用电脑登录到树莓派,或者通过 HDMI 连接外接显示器查看。这样做总是有点麻烦,我们可以通过外接一个 OLED 屏来显示一些关键参数或者图片。本文将详细介绍操作方法。 OLED 模组介绍 OLED 屏主要有两种:128×32 和 128×64 ,主要颜色是白、黄、蓝。OLED 屏的特点是功耗低,价格便宜,使用 I2C 接口与主机连接。本文所使用的是 128×64 尺寸的屏幕,外形如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直

码到成功 3744

Python中的迭代器与生成器

迭代器与生成器

Broken_x的博客 1541

【AI智能体】图像处理-生成营销 Banner 图

生成营销 Banner 图是一款用于制作营销图片的智能体,它可以根据指定的营销活动内容,快速生成活动 Banner 图片,降低活动运营成本、提高制图效率。

AI创变工坊,和1000万新个体创业者一起成长!愿大家都能跟上时代的洪流,不被社会淘汰,愿大家的生活工作收入都能具备竞争力! 1175

Python进阶 - 迭代器的遍历 手动调用next方法与StopIteration异常

Python迭代器遍历机制解析 本文深入探讨了Python中迭代器的核心原理,重点分析了手动调用next()方法与StopIteration异常的交互机制。主要内容包括: 迭代器本质:通过实现__iter__()和__next__()方法,迭代器可以逐个返回元素,直到抛出StopIteration表示终止。 next()方法: 核心功能是推进迭代器状态 可配合default参数避免异常 示例展示了手动遍历列表的过程 StopIteration: 作为迭代终止的正常信号 建议使用try-except捕获处理

千淘万漉虽辛苦,吹尽狂沙始到金 7917

告别混乱!AutoSar BswM模式管理实战:手把手教你配置Rule与ActionList(附避坑指南)

本文详细解析了AutoSar BswM模式管理的实战配置,重点介绍了Rule与ActionList的高效组合方法,帮助开发者避免常见陷阱。通过具体案例演示了从基础到复杂的配置步骤,包括模式仲裁、逻辑表达式构建及ActionList优化策略,提升汽车电子系统的协调性与可靠性。

weixin_27066963的博客 260

深入解析STM32F40x CAN控制器的配置与优化

本文深入解析STM32F40x CAN控制器的配置与优化,涵盖基础工作模式、波特率计算、筛选器配置及中断管理等关键技术。通过实战案例和代码示例,帮助开发者高效配置CAN通信,提升工业控制系统的稳定性和性能。

weixin_26834815的博客 225

【Python】迭代器(Iterator)vs 生成器(Generator)

迭代器是一个可以逐个访问元素的对象,比如 list、dict、set 都可以通过 iter() 转换成迭代器。

Data · Model · Agent · Repeat 969

基于Simulink的光伏-储能-柴油机混合微网仿真

摘要:本文基于Simulink平台构建光伏-储能-柴油机混合微网仿真模型,实现可再生能源与备用电源的协同控制。通过光伏优先、储能调节、柴油机兜底的规则控制策略,在24小时仿真中验证了系统在晴天、阴天和夜间三种典型工况下的运行性能。模型采用PVArray模块模拟光伏发电,Simscape电气库构建储能系统,自定义MATLAB函数实现柴油机启停逻辑和能量管理。仿真结果显示系统功率平衡误差<5%,储能SOC维持在20%-80%,柴油机日均运行时间<4小时,满足设计指标。文章详细说明了建模步骤、参数设置

xiaoheshang_123的博客 70

【Python】迭代器(iterator) vs 生成器(generator)

对python中的迭代器(iterator) vs 生成器(generator)之间的区别和应用进行介绍。

zwan0518的专栏 8682

生成模型实战 | StyleGAN详解与实现

StyleGAN 能够生成非常高分辨率人脸图像的关键在于,在增加分辨率的步骤中逐步增加生成网络和判别网络的复杂性,以便在每一步中,两个模型都可以很好地完成任务。我们学习了如何通过确保每个分辨率的特征由一个独立的输入(称为风格向量)来控制,从而操纵生成图像的风格,以及如何通过将图像之间的风格进行交换来操作不同图像的风格。

盼小辉丶的博客 7651

使用 Prometheus 监控 Spring Boot 应用

本文介绍了使用SpringBoot+Prometheus+Grafana实现应用监控的方案。首先在SpringBoot项目中集成Micrometer和Actuator组件,通过配置暴露Prometheus监控端点。接着配置Prometheus采集应用指标数据,并通过Grafana可视化展示。具体步骤包括:1)SpringBoot集成Micrometer;2)配置Prometheus抓取应用指标;3)安装Grafana并导入SpringBoot监控模板;4)展示JVM和业务指标。该方案可以实现对SpringB

蔡定努 431

Python:迭代器VS生成器

1.定义 可迭代对象(Iterable类型):可迭代对象是指任何定义了__iter__方法的对象。可迭代对象的__iter__方法负责返回一个迭代器。 迭代器(Iterator类型):Python中的迭代器是包含__next__方法(即,能够响应next函数)的任何对象。Iterator对象表示一个惰性计算序列。只能不断通过next()函数实现按需计算下一个数据,直到遇到StopIterati...

读万卷书 行万里路 212

通俗范畴论10 泛性质(MD版)

既然泛性质可以在同构意义下唯一确定一个泛构造,那么我们就可以用泛性质来定义泛构造。我们回顾一下已经掌握的泛性质和泛构造。泛性质其实我们并不陌生,始对象和终对象,就是具有泛性质的对象,一个具有“始”的泛性质,一个具有“终”的泛性质。比如始对象,如果一个范畴里面有始对象,它到所有对象都有且只有一个态射,这样的对象可能有两个么?嗯,还真可能,但是这两个始对象同构,所以在同构意义下,它们可以看成一个,因此在同构意义下,始对象是唯一的。同理,终对象也一样。同构的始对象。

RockTec的专栏 478

python中的迭代器与生成器

只要 Python 看到函数定义体内存在 yield,它就把这个函数标记为生成器函数。,这个 1 只是变量状态,不会自动跑出来,必须等。写在代码里 ≠ 程序已经跑到这行执行了。打印出来的是对象描述、内存地址,只是做初始化、返回迭代器;负责驱动工具产出数据。

weixin_46812661的博客 644

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Python基础-生成器和迭代器

本文系统梳理了Python中迭代器、可迭代对象和生成器的核心概念与用法。首先明确迭代器对象需实现__iter__和__next__方法,并解释了for循环的工作原理是通过iter获取迭代器后反复调用next。其次区分了迭代器对象与可迭代对象的关系,指出迭代器一定是可迭代对象。然后重点介绍了生成器,这是一种特殊迭代器,通过yield关键字实现暂停执行和恢复执行的特性,详细说明了send()和close()等方法的用法。最后介绍了生成器表达式语法,并通过质数生成器等示例代码展示了实际应用场景。全文通过大量代码示

tuguai7887的博客 734

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Javascript迭代器与生成器

本文主要讲解了JavaScript中,迭代器与生成器的原理和使用。

CyrusCJA的博客 682

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【python面向对象编程】迭代器与生成器

本文介绍了Python中的迭代器和生成器概念。迭代器是表示数据流的对象,通过iter()将可迭代对象转为迭代器,使用next()逐个获取元素,直到抛出StopIteration异常。文件对象是典型迭代器应用。iter()还支持双参数形式,通过回调函数和哨兵值控制迭代。生成器通过yield关键字简化迭代器创建,能更简洁地实现迭代功能。生成器表达式类似列表推导式,使用圆括号语法,更节省内存。两者都能实现迭代功能,但生成器通常更简洁高效。

Kratzdisteln的博客 1084

迭代器与生成器

1 简介 list,tuple,dict,set都是容器,容器是可迭代对象,可迭代对象通过调用iter()函数可以得到一个迭代器。 迭代器可以通过next()函数来得到下一个元素,从而支持遍历。 生成器,迭代器,可迭代对象,容器,他们之间的关系。图片来自https://nvie.com/posts/iterators-vs-generators/ 参考https://zhuanlan.zh...

ustbbsy的博客 175

Python小知识:迭代器 vs 可迭代对象 vs 生成器

先上结论 先说结论,再解释: iterable是可迭代对象,它的唯一特征是有__iter__函数,调用这个函数会返回一个iterator。 iterator是迭代器,它的唯一特征是有__next__函数,调用这个函数会返回下一个元素。 有些类同时有以上两个函数,所以即是iterable,又是iterator,这是为了方便,不用额外创建iterator类。 generator是用yield函数定义的iterator。它必然也有__next__函数。 几个iterable例子 可以用for循环遍历的对象都是

weixin_58753619的博客 141

python:生成器 VS 迭代器

生成器 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在...

adouwen3320的博客 98

python和生成器的区别_详解Python3中的迭代器和生成器及其区别

介绍本篇将介绍Python3中的迭代器与生成器,描述可迭代与迭代器关系,并实现自定义类的迭代器模式。迭代的概念上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值注:循环不是迭代while True: #只满足重复,因而不是迭代print('====>')迭代器1.为什么要有迭代器?对于没有索引的数据类型,必须提供一种不依赖索引的迭代...

weixin_39655362的博客 99

python 中的迭代器与生成器

python 迭代器和生成器

rainturbons的博客 238

Python学习-迭代器、生成器

本文摘要: Python迭代器是可记住遍历位置的对象,通过iter()和next()实现逐个数据访问。生成器是简化版的迭代器,使用yield实现惰性计算,适合大数据处理。property属性装饰器可将方法伪装成属性,提供简洁接口。正则表达式通过re模块实现字符串匹配,包含元字符和预定义字符两类匹配规则,支持分组提取等功能。

m0_62343698的博客 389

python迭代器和生成器_详解Python3中的迭代器和生成器及其区别

介绍本篇将介绍Python3中的迭代器与生成器,描述可迭代与迭代器关系,并实现自定义类的迭代器模式。迭代的概念上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值注:循环不是迭代while True: #只满足重复,因而不是迭代print('====>')迭代器1.为什么要有迭代器?对于没有索引的数据类型,必须提供一种不依赖索引的迭代...

weixin_39830233的博客 97

生成器&迭代器(python为例)

本文深入解析Python中迭代器(Iterator)与生成器(Generator)的核心概念与实践应用。迭代器是通过实现 __iter__ 和 __next__ 方法的对象,提供了一种统一的遍历数据集合的接口,支持for循环及next()逐项访问;生成器则是基于yield关键字的高效工具,能按需生成值并自动实现迭代器协议。

是分享,也是笔记,欢迎大家补充纠错,共同进步 422

2021-08-18Python基础之迭代器、生成器

Python基础之迭代器、生成器1、迭代器2、生成器 1、迭代器 可迭代对象 可迭代对象(interable) 可以通过 for …i …遍历读取的对象 常见的可迭代对象:字符串、列表、字典、集合 可迭代对象的本质就是向我们提供一个这样的中间‘人’,即迭代器 帮助我们对其进行迭代遍历 满足以下的称为可迭代对象: 对象实现了 __iter__方法 __iter__方法返回了迭代器对象 判断对象是否可爹迭代 from collections.abc import Iterable

qq_43734041的博客 688
上一篇: 避免生产环境崩溃:raise from在异常传递中的4个黄金法则
下一篇: Python 3.8新特性实战(海象运算符循环技巧大公开)
CodeIsle
博客等级 码龄1年 145粉丝 1966原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值