Python 高级特性-迭代器

news/2025/2/24 13:17:53

目录

迭代器

小结


迭代器

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如listtupledictsetstr等;

一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

可以使用isinstance()判断一个对象是否是Iterable对象:

python">>>> from collections.abc import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False

而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

可以使用isinstance()判断一个对象是否是Iterator对象:

python">>>> from collections.abc import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数:

python">>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

你可能会问,为什么listdictstr等数据类型不是Iterator

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

小结

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

Python的for循环本质上就是通过不断调用next()函数实现的,例如:

python">for x in [1, 2, 3, 4, 5]:
    pass

实际上完全等价于:

python"># 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

http://www.niftyadmin.cn/n/5864374.html

相关文章

在 Mac ARM 架构上使用官方安装包安装 MySQL

在 Mac ARM 架构 (Apple Silicon,例如 M1, M2, M3 芯片) 上使用官方安装包安装 MySQL,步骤与在 Intel Mac 上类似,但需要确保下载的是 ARM 架构兼容的版本。以下是详细的安装步骤: 步骤 1: 下载 MySQL Community Server DMG 安装…

数据结构:基数排序(c++实现)

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 基数排序的定义和基本原理基本原理具体步骤 基数排序的优缺点:代码实现总结 基数排序的定义和基本原理 基数排序(Radix Sort)是一…

go-zero学习笔记(五)

api自定义中间件 1. 修改.api文件 syntax"v1"type (GetInfoReq {IDs []string json:"IDs"}GetInfoData {ID string json:"ID"Name string json:"Name"MD5 string json:"md5"Size int64 json:"Size"Up…

Future和FutureTask实现类详解以及使用。

前言 Future是Java并发编程中的一个接口,用来表示异步计算的结果。它允许我们提交一个任务,然后之后再去获取结果,或者在结果可用时处理它。 我们需要考虑Future的主要方法。根据文档,Future接口有几个关键方法:isDo…

【HarmonyOS Next】地图使用详解(一)

背景 这系列文章主要讲解鸿蒙地图的使用,当前可以免费使用,并提供了丰富的SDK给开发者去自定义控件开发。目前可以实现个性化显示地图、位置搜索和路径规划等功能,轻松完成地图构建工作。需要注意的是,现在测试只能使用实体手机去…

mongodb的并发优化

MongoDB的锁模式 MongoDB的锁设计 MongoDB的高性能表现离不开它的多粒度锁机制。多粒度主要可以针对不同层级的数据库对象进行枷锁,通过避免全局性的互斥来提升并发能力。从整个数据库层面看,MongoDB的并发锁的分层如下图所示: 从上往下是一…

计算机网络之路由协议(自治系统)

一、自治系统(AS) 自治系统是由同一个技术管理机构管理、使用统一选路策略的一些路由器的集合。它是网络的基本构成单位,每个自治系统是一个独立运营并自主决定与谁交换流量的实体。自治系统内部运行内部网关协议(IGP&#xff09…

【过程控制系统】第一章 过程控制系统的设计和发展趋势,确定系统变量和控制方案

给大家分享我最近的作品 绘画时间:2025/2/23 角色:宫本武藏 Fate/Sumurai Renment 关注作者了解更多 我的其他CSDN专栏 毕业设计 求职面试 大学英语 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控…