Python 中 Iterator和Iterable的区别

2023-10-29

Python中 list,truple,str,dict这些都可以被迭代,但他们并不是迭代器。为什么?

因为和迭代器相比有一个很大的不同,list/truple/map/dict这些数据的大小是确定的,也就是说有多少事可知的。但迭代器不是,迭代器不知道要执行多少次,所以可以理解为不知道有多少个元素,每调用一次next(),就会往下走一步,是惰性的。


判断是不是可以迭代,用Iterable

from collections import Iterable
isinstance({}, Iterable) --> True
isinstance((), Iterable) --> True
isinstance(100, Iterable) --> False


判断是不是迭代器,用Iterator

from collections import Iterator
isinstance({}, Iterator)  --> False
isinstance((), Iterator) --> False
isinstance( (x for x in range(10)), Iterator)  --> True

所以,

凡是可以for循环的,都是Iterable

凡是可以next()的,都是Iterator

集合数据类型如list,truple,dict,str,都是Itrable不是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



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中 Iterator和Iterable的区别 的相关文章

随机推荐

  • qt中在不同类间传递参数的几种方式

    最近开发一个程序 需要多个源文件 包括若干个头文件和若干个定义文件 因此如何在多个源程序间开发传递变量就成了一个关键问题 刚开始我通过构造函数传递参数 能成功传递但数据却不会自动更新 随后想到通过全局变量传递参数 一般来说在多个源程序间传递
  • 运维Shell脚本牛刀小试(九): 重定向操作符“>“及双重定向“>>“

    运维Shell脚本小试牛刀 一 运维Shell脚本小试牛刀 二 运维Shell脚本小试牛刀 三 cd dirname 0 pwd 命令详解 运维Shell脚本小试牛刀 四 多层嵌套if elif elif else fi 蜗牛杨哥的博客 C
  • 二叉树的中序遍历、两数之和、整数反转

    Java学习路线 搬砖工逆袭Java架构师 简介 Java领域优质创作者 CSDN哪吒公众号作者 Java架构师奋斗者 扫描主页左侧二维码 加入群聊 一起学习 一起进步 欢迎点赞 收藏 留言 目录 1 LeetCode 94 二叉树的中序遍
  • 项目中使用JsonSerializer将JavaBean中Date毫秒级转秒级的简便方法

    此项目是基于SpringBoot实现的 我的JavaBean中有两个Date属性 如下 private Date createTime private Date updateTime 我通过crud 增删改查 操作返回的是毫秒级别的 但我前
  • Qt中多进程写法

    进程 运行中的程序 比如下面这些 没运行的就不算 线程 简单记为程序中的函数 qt中多进程写法 这个比较简单 就没有什么文字说明了 1 widget h ifndef WIDGET H define WIDGET H include
  • Source insight 4工程设置相对地址

    我是阿荣 关注我 在技术路上一起精进 Source insight 使用说明 Source insight 软件版本 V4 00 0084 建议都使用 V4 0 版本的 Source insight 新建相对地址的 Source insig
  • java.lang.IllegalArgumentException: taglib definition not consistent with specification version

    tomcat8 0中使用taglib 错误表现 java lang IllegalArgumentException taglib definition not consistent with specification version 原
  • 4399游戏校招笔试题

    设一组初始记录关键字序列为 49 38 65 97 76 13 27 49 则以第一个关键字49为基准而得到的一趟快速排序结果是 A 38 13 27 49 49 65 97 76 B 13 27 38 49 65 76 97 49 C 2
  • 常用技术指标之一文读懂KDJ指标

    什么是KDJ指标 KDJ中文名又叫随机指标 英文名叫Stochastic oscillator 由乔治 莱恩 George Lane 于20世纪50年代首创 最早用于期货市场 KDJ指标能比较迅速 直观地研判行情 主要用于分析中短期趋势 是
  • 主键约束(PRIMARY KEY) [MySQL][数据库]

    主键约束 PRIMARY KEY 主键约束的特点 主键约束相当于唯一性约束 非空约束 主键约束不允许重复 也不允许出现空值 一个表最多只能有一个主键约束 建立主键约束可以在列级别创建 也可以再表级别创建 主键约束对应着表中的一列或者多列 对
  • JDK8:使用Optional进行变量判空、集合遍历

    防止 NPE 是程序员的基本修养 NPE Null Pointer Exception 一直是我们最头疼的问题 也是最容易忽视的地方 NPE常是导致Java应用程序失败的最常见的原因 在日常研发工作中 经常会处理各种变量 集合 但在使用的过
  • 【vue、uni-app】文本信息的完全显示(回车换行、连续空格、数字&英文换行)

    vue uni app 文本信息的完全显示 回车换行 连续空格 数字 英文换行 数据说明 完整显示 一 vue端 1 不做处理的效果 2 处理后 二 uni app端 1 不做处理的效果 2 处理后 总结 记录学习的轨迹 2021 12 0
  • 线程知识点补充

    全局解释器锁GIL 是什么 GIL本质也是一把互斥锁 将并发变成串行 降低效率以保证数据的安全性 每有一个进程 进程内就必然有一个用来执行代码的线程 也会有一个用来执行垃圾回收的线程 为了避免执行代码的线程和执行垃圾回收的线程对同一份数据进
  • golang 单元测试、性能测试、性能监控技术

    golang 单元测试 性能测试 性能监控技术 go语言提供了强大的测试工具 下面举例简单介绍一下 go test 单元测试 go test bench 性能测试 go tool pprof 性能监控 go test 单元测试 例如对包he
  • 至强服务器性能排行,英特尔至强处理器排名天梯 至强cpu天梯2020排名

    排名 名称 评分 1 Intel Xeon Platinum 8173M 2 00GHz 28 860 2 Intel Xeon Gold 6154 3 00GHz 27 722 3 Intel Xeon Gold 6138 2 00GHz
  • 【研究生】毕业答辩PPT制作和讲述要点(整理)

    引用网址 http blog sciencenet cn blog 53846 232974 html 引言 在QQ群上和研三的点评答辩ppt制作结果 不知不觉 唠叨 了很多 其中 让大家共享一下彼此的ppt文档 取人所长 不想 学生杨涛有
  • React SSR - 写个 Demo 一学就会

    今天写个小 Demo 来从头实现一下 react 的 SSR 帮助理解 SSR 是如何实现的 有什么细节 什么是 SSR SSR 即 Server Side Rendering 服务端渲染 是指将网页内容在服务器端中生成并发送到浏览器的技术
  • BTC-分叉

    分叉 fork 原来由一条链变为了两条链 造成原因 有可能是两个节点差不多同时挖到了一个区块 然后同时发布出去 这时候就会造成临时性的分叉 state fork forking attack deliberate fork 比特币的协议发生
  • 扫码普通二维码跳转微信小程序指定页面(体验服和开发服跳转链接不能动态传参)

    好久不见 时隔多年我又来记录问题来了 记录这次问题的主要原因是减少你我去搜索资源的时间 下面开始讲讲我越到的问题 下面说的是针对小程序体验版或者开发版哈 正式环境不存在这个问题 需求 pc端扫码登录 pc创建一个二维码 用户用微信自带扫码功
  • Python 中 Iterator和Iterable的区别

    Python中 list truple str dict这些都可以被迭代 但他们并不是迭代器 为什么 因为和迭代器相比有一个很大的不同 list truple map dict这些数据的大小是确定的 也就是说有多少事可知的 但迭代器不是 迭