当前位置: 首页 > news >正文

Python 高级特性-迭代器

目录

迭代器

小结


迭代器

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

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

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

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

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

>>> 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对象:

>>> 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()函数:

>>> 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()函数实现的,例如:

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

实际上完全等价于:

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

相关文章:

  • 【练习】【子集NO.1】力扣78. 子集
  • 【Research Proposal】基于提示词方法的智能体工具调用研究——难点
  • 解决 Nginx 代理后 HTTP 头部丢失的问题:以 access_token 为例
  • 蛋白质研究常用数据库系列1
  • Windows 下 Visual Studio Code 常用快捷键指南
  • IoT设备硬件攻击技术与接口漏洞利用
  • 【量化科普】Arbitrage,套利
  • The Heliosphere 日球层
  • 如何让大模型理解变量,扣子(coze)智能体中变量描述起着啥作用?程序员看了集体惊呆!扣子免费系列教程(19)
  • 记录spring-boot 3.X版本整合RocketMq
  • AMBA-CHI协议详解(二十)
  • 智慧废品回收小程序php+uniapp
  • PD协议芯片:推动快充技术革新的核心引擎
  • 了解 RAG 第二部分:经典 RAG 的工作原理
  • Java 值传递
  • 轻量级日志管理平台Grafana Loki
  • LeetCode 热题 100 11. 盛最多水的容器
  • (四)趣学设计模式 之 原型模式!
  • Web自动化之Selenium实战案例1:论文pdf自动下载
  • git 常用功能
  • pc 网站开发设计/百度手机助手app官方下载
  • 怎么申请做网站/河南网站开发公司
  • 做笔记的网站/百度信息流广告位置
  • 做小程序的公司有哪些比较好/常州seo博客
  • 政府门户网站建设 投标文件/专业做网站设计
  • 信息门户网站制作/百度秒收录技术