[Python学习日记-43] Python 中的迭代器

[Python学习日记-43] Python 中的迭代器

简介

可迭代对象

迭代器

总结

简介

        前面我们学习了各种各样的数据类型,在使用它们的时候我们也时不时会听到可迭代对象这一个名词,而本篇我们将讲述的迭代器感觉和我们之前学的可迭代对象挺相关的,那他们之间到底是什么关系呢?那又和我们之前讲过的生成器又是什么关系呢?下面我们来一起学习一下迭代器吧。

可迭代对象

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

  1. 一类是集合数据类型,例如列表(list)、元组(tuple)、字典(dict)、集合(set)、字符串(str)等
  2. 一类是生成器(generator)和带 yield 的函数生成器(generator function)

        这些可以直接作用于 for 循环的对象统称为可迭代对象(Iterable),可迭代的意思就是可遍历、可循环。可以使用 isinstance() 判断一个对象是否是 Iterable 对象,代码如下

注意:

  • 在 Python 3.10 之前的版本可以使用以下方式来从 collections 库当中调取 Iterable 对象
from collections import Iterable
  •  在 Python 3.10 之后的版本由于版本更新,原来的 collections 库下的 Iterable 对象已被取消,转而挪到了  collections.abc 下,Iterator 对象也是同样的状况,可以使用以下的方法进行调用
from collections.abc import Iterable
  • 但由于 Python 3.10 前后都会被统称为 Python3,为避免不同版本之间会因为这个报错,我们在使用的时候可以做一些如下的差错处理 
try:from collections.abc import Iterable
except ImportError:from collections import Iterable
  • 该注意事项在 Iterator 对象当中也适用 

        而在写这篇文章的时候我们使用的是 Python 3.12.4 版本的,所以我们会用到 collections.abc,不过在代码中我们还是加入差错处理会比较稳健一些

try:from collections.abc import Iterable
except ImportError:from collections import Iterableprint(isinstance([], Iterable))    # 列表,True
print(isinstance({}, Iterable))    # 集合,True
print(isinstance("abc", Iterable))    # 字符串,True
print(isinstance((x for x in range(10)), Iterable))    # 生成器,True
print(isinstance(100, Iterable))    # 数字,False

代码输出如下:

迭代器

        从上面的输出可以看出,生成器也是可迭代对象之一,不过生成器不但可以作用于 for 循环,还可以被 next() 函数不断调用并返回下一个值,直到最后抛出 Stoplteration 错误表示无法继续返
回下一个值了为止。而生成器就是迭代器之一了,我们把可以被 next() 函数调用并不断返回下一个值的对象称为迭代器(Iterator)。可以使用 isinstance() 判断一个对象是否是 Iterator,代码如下

try:from collections.abc import Iterator
except ImportError:from collections import Iteratorprint(isinstance((x for x in range(10)), Iterator))    # 生成器,True
print(isinstance([], Iterator))    # 列表,False
print(isinstance({}, Iterator))    # 集合,False
print(isinstance("abc", Iterator))    # 字符串,False

代码输出如下:

 

        从输出可以看出生成器都是 Iterator 对象,但列表(list)、集合(set)、字符串(str)虽然是 Iterable,却不是 Iterator。但是我们可以使用 iter() 函数把列表(list)、集合(set)、字符串(str)这类 Iterable 变成 Iterator,代码如下

try:from collections.abc import Iterator
except ImportError:from collections import Iteratorprint(isinstance(iter([]), Iterator))
print(isinstance(iter({}), Iterator))
print(isinstance(iter("abc"), Iterator))

代码输出如下:

        这里会有个疑问,为什么列表(list)、集合(set)、字符串(str)这类数据类型不是 Iterator 呢?这是因为 Python 的 Iterator 对象表示的是一个数据流,Iterator 对象可以被 next() 函数调用并不断返回下一个数据,直到没有数据时才抛出 StopIteration 错误。我们可以把这个数据流看作是一个有序序列,但我们却不能提前知道序列的长度,所以只能不断通过 next() 函数实现按需计算下一个数据,并且 Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。而列表(list)、集合(set)、字符串(str)这类数据类型从一开始数据长度就是确定的。总的来说,Iterator 甚至可以表示一个无限大的数据流,例如全体自然数。而使用列表(list)、集合(set)、字符串(str)这类数据类型是永远不可能存储全体自然数的。

总结

  • 凡是可作用于 for 循环的对象都是 Iterable 类型
  • 凡是可作用于 next() 函数的对象都是 Iterator 类型,它们表示一个惰性计算的序列
  • 集合数据类型例如列表(list)、集合(set)、字符串(str)等是 Iterable 但不是 Iterator,不过可以通过 iter() 函数获得一个 Iterator 对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/448342.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

URDF统一机器人建模语言

统一机器人建模语言 URDF(Unified Robot Description Format)统一机器人描述格式,URDF使用XML格式描述机器人文件。 我们从下面四个方面介绍URDF: URDF的组成介绍 URDF-Link介绍 URDF-Joint介绍 创建一个简单的URDF…

五年以上倾斜摄影osgb模型转3dtiles如何在mars3d加载

方案一: // 兼容1.50 (2018-10-01)版本更改了名称,造成部分3dtiles可能会出现加载不上导致渲染停止的错误。 // 错误说明为:RuntimeError: Unsupported glTF Extension: KHR_technique_webgl // 原因:KHR_technique_w…

Java基础常见面试题总结(上)

基础概念与常识 Java 语言有哪些特点? 简单易学(语法简单,上手容易);面向对象(封装,继承,多态);平台无关性( Java 虚拟机实现平台无关性)&…

【9724】基于springboot+vue的篮球竞赛预约平台

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 本次设计任务是要设计一个篮球竞赛预约平台&#xff0c…

软件架构师 PV

PV操作与生产者消费者问题是操作系统中进程管理和同步机制的重要概念。以下是对PV操作以及生产者消费者问题的详细解释: 一、PV操作 PV操作由P操作原语和V操作原语组成,这两个原语是不可中断的过程,它们对信号量进行操作。 P操作&#xff…

泰克MDO3054示波器特性和规格Tektronix MSO3054 500M 四通道

Tektronix MDO3054 示波器,混合域,500 MHz,4 通道,5 GS/s 泰克 MDO3054 混合域示波器是终极 6 合 1 集成示波器,包括可选的集成频谱分析仪、任意函数发生器、逻辑分析仪、协议分析仪和数字电压表/计数器。泰克 MDO305…

(25)QPSK信号在AWGN和Rayleigh衰落信道下的性能仿真

文章目录 前言一、MATLAB仿真代码二、仿真结果 前言 QPSK信号在AWGN和Rayleigh衰落信道下的性能仿真MATLAB代码。 一、MATLAB仿真代码 代码如下: nSamp 8; % 矩形脉冲的采样点数 nSymbol 1000000; % 传输的符号…

霍夫圆型硬币检测Matlab程序

1. 图像读取和预处理 使用MATLAB的uigetfile函数读取图像,可以从文件系统中选择图像文件。读取的图像随后经过灰度化处理,将彩色图像转换为灰度图像,以降低计算复杂度并去除不必要的颜色信息。 2. 中值滤波 在图像预处理过程中,…

uni-app 打包成app时 限制web-view大小

今天对接一个uni-app的app 内置对方h5 web-view的形式 需要对方在web-view顶部加点东西 对方打的app的web-view始终是全屏的状态,对方表示做不到我要的效果 emmmmmm。。。。。。 于是乎 自己搭了个demo 本地h5跑起来审查了下代码,发现web-view是给绝对定…

EasyOCR——超强超便捷的OCR开源算法介绍与文本检测模型CRAFT微调方法

背景 最近在实际操作阿拉伯文小语种OCR功能的时候,尝试了诸多开源算法,但效果均不尽如人意。 说实在的,针对阿拉伯文的OCR开源算法,若仅仅是效果没那么优秀,比如识别率能有个70%80%,我还能微调微调&#…

例行性工作(at,crontab)

(一)单一执行的例行性工作: ----at (1)原理:仅处理执行一次就结束了 (2)命令及其解释: (2.1)at命令格式:at [参数] [执行时间] &am…

C++ Builder XE12关于KonopkaControls与TMS VCL UI Pack组件的安装

1、先打开open project,选中安装的组件工程,并打开。 2、在option中设置 3、点击编译并进行安装install

【SpringAI】(一)从实际场景入门大模型——适合Java宝宝的大模型应用开发

一、简单场景介绍 假设你需要为一个商城项目接入一个基于SpringAI的智能客服系统,现在我们来基本模拟一下: 当我通过系统提问,大模型会针对我的问题进行回答。 当我们通过程序提问时,SpringAI会将我们的提问封装成Prompts&#x…

一分钟带你认清Java抽象类

abstrat——抽象,抽象类真的有像它的名字一样那么抽象吗?其实不然,它只是一个比较特殊的类别,我们只需要简单地认清它的作用就行,一起来看看吧~ 抽象类的概念 首先我们要明确一个事情:在面向对象的概念中&…

基于vue框架的宠物管理系统fyv66(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,宠物分类,宠物信息,宠物用品,用品分类,洗护类型,商家,宠物洗护 开题报告内容 基于Vue框架的宠物管理系统开题报告 一、背景与意义 随着城市化进程的加速和生活水平的提高,宠物已成为许多家庭的重要成员,宠…

RabbitMQ service is already present - only updating service parameters

Windows下卸载RabbitMQ之后,然后重新注册RabbitMQ服务的时候,报错以下信息: D:\software\rabbitmq-server-4.0.2\rabbitmq_server-4.0.2\sbin>D:\software\rabbitmq-server-4.0.2\rabbitmq_server-4.0.2\sbin\rabbitmq-service.bat install RabbitMQ service is already …

FFmpeg 简介及其下载安装步骤

目录 一、FFmpeg 简介 二、FFmpeg 安装步骤 2.1 打开官网 2.2 选择FFmpeg系统版本 2.3 下载FFmpeg压缩包 2.4 将下载好的压缩包进行解压 2.5 设置环境变量 2.5.1 在搜索栏中搜索【环境变量】,然后单击将其打开 2.5.2 找到系统变量中的【Path】,点…

Python异常处理详解:try, except, else, finally的使用方法与示例

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

力反馈手套如何在VR培训解决方案中为用户提供沉浸式体验?

在VR训练中如何为用户带来更加沉浸式的使用体验一直是该领域不断向前探索的发展方向。力反馈手套的融入为VR训练中的沉浸式交互指出了全新的发展方向。通过使用像SenseGlove Nova这样的虚拟现实力反馈手套,用户能够在VR虚拟训练场景中真实的感受到虚拟物体的尺寸大小…

uniapp 小程序0到1教程

先说明一下,uni-app的文档很乱 一、注册微信小程序 如果你还没有微信公众平台的账号,请先进入微信公众平台首页,点击 “立即注册” 按钮进行注册。注册的账号类型可以是订阅号、服务号、小程序以及企业微信,我们选择 “小程序”…