Python进阶之迭代器

news2024/11/30 0:42:17

文章目录

  • 前言
  • 一、迭代器介绍及作用
    • 1.可迭代对象
    • 2. 迭代器
  • 二、常用函数和迭代器
    • 1.常用函数
    • 2.迭代器
  • 三、总结
  • 结束语


  • 💂 个人主页:风间琉璃
  • 🤟 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主
  • 💬 如果文章对你有帮助欢迎关注点赞收藏(一键三连)订阅专栏

前言

Python有三大器:迭代器生成器装饰器。这里给大家先介绍迭代器相关的知识。


一、迭代器介绍及作用

1.可迭代对象

在介绍迭代器之前介绍一下迭代和可迭代对象的概念:

迭代:通常从一个对象中依次取出数据,这个过程叫做遍历,也称为**迭代(**重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值)。

可迭代对象是指该对象可以被用于for循环,例如:集合,列表,元组,字典,字符串,迭代器等。直接作用于for循环的对象统称为可迭代对象(Iterable)

那么在代码层面如何定义一个可迭代对象呢?

在python中如果一个对象实现了__iter__方法,则该对象可以称之为可迭代对象。例如,可以查看list,set等其内部均实现了__iter__方法,实现方式和对象的初始化方法一样。

class MyIterable:
    def __init__(self):
        pass
    
    def __iter__(self):
        return self
    

如果一个对象未实现__iter__方法,对其使用for则会抛出TypeError: ‘xxx’ object is not iterable。

MyIterable实现了__iter__方法,则MyIterable就是一个可迭代对象。可以通过如下方式判断一个对象是不是可迭代对象?

# 导入collections.abc模块中的Iterable对象
import collections.abc

class MyIterable:
    def __init__(self):
        pass

    def __iter__(self):
        return self

obj = MyIterable()

# 判断str是否可迭代
a = isinstance(obj, collections.abc.Iterable)
# 打印迭代结果
print(a)

2. 迭代器

迭代器对可迭代对象进行迭代的方式或容器,并且需要记录当前迭代进行到的位置

Python迭代器可以被定义为:
⋆ \star 在python中如果一个对象同时实现了__iter____next__(获取下一个值)方法
⋆ \star 可以通过内置函数next(iterator)实例对象的__next__()方法来获取当前迭代的值
⋆ \star 迭代器一定是可迭代对象,可迭代对象不一定是迭代器。
⋆ \star 如果可迭代对象遍历完后继续调用next(),则会抛出:StopIteration异常

注意第三点,一个对象要同时实现__iter____next__才 可以称为迭代器,只有实现__iter__方法的称为可迭代对象。可通过如下方式判断一个对象是不是迭代器?

# 导入collections.abc模块中的Iterable对象
import collections.abc

class MyIterable:
    def __init__(self):
        pass

    def __iter__(self):
        return self

obj = MyIterable()

# 判断str是否可迭代
a = isinstance(obj, collections.abc.Iterable)  # True
b = isinstance(obj, collections.abc.Iterator)  # False
# 打印迭代结果
print(a)
print(b)

从这里可以看到obj是可迭代对象,但不是迭代器。常见数据类型Iterable和Iterator分类:
在这里插入图片描述
你可能会问,为什么list、dict、str等数据类型不是Iterator?

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

下面是一个简单的Python迭代器示例:

# 导入collections.abc模块中的Iterable对象
import collections.abc

class MyIterable:
    def __init__(self, mylist):
        self.mylist = mylist  # 列表
        self.index = 0   # 索引

    def __iter__(self):
        return self

    def __next__(self):
        if self.index < len(self.mylist):
            value = self.mylist[self.index]
            self.index += 1
            return value
        else:
            raise StopIteration

mylist = [1, 2, 3, 4, 5]
iterableobj = MyIterable(mylist)  # 迭代器(可迭代对象)

# a = isinstance(iterableobj, collections.abc.Iterable)  # True
# b = isinstance(iterableobj, collections.abc.Iterator)  # False

在这个示例中,我们创建了一个称为"MyIterable"的类,它包含了一个列表和一个索引值。该类还实现了__iter__()和__next__()方法。因此iterableobj是一个迭代器(可迭代对象)。

__iter__()方法返回该对象本身,因此可以直接对该对象使用for…in…语句进行迭代。
__next__()方法则根据当前索引值来获取列表中的下一个元素,如果已经到达列表末尾,则抛出StopIteration异常。因此有两种方法打印输出。

(1)使用for循环打印输出

for item in iterableobj:
    print(item)

(2)使用next函数

while True:
    try:
        # 获得下一个值:
        x = next(iterableobj)
        print(x)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

注意不要两种方式一起用,一起使用的话,只会打印输出一次,可能是由于底层都是调用的迭代器吧,迭代器会记录当前迭代的位置,使用其中一种方式后,迭代器计数器已经到末尾了,当第二次使用的时,自然啥也不会输出。

二、常用函数和迭代器

1.常用函数

2.迭代器

三、总结

优点:迭代器对象表示的是一个数据流,可以在需要时才去调用next来获取一个值;因而本身在内存中始终只保留一个值,对于内存占用小可以存放无限数据流。由于其他容器需要一次将所有元素都存放进内存,如:列表、集合、字典…等

缺点无法获取存放的元素长度,除非取完计数。同时取值不灵活,只能向后取值,next()永远返回的是下一个值;无法取出指定值(如字典的key,或列表的下标),而且迭代器对象的生命周期是一次性的,元素被迭代完则生命周期结束。

Python 的迭代器提供稳定和灵活的代码。迭代器和可迭代对象的区别:
⋆ \star Iterable​ 是一个可以迭代的对象。它在传递给​​iter()​​方法时生成一个迭代器

⋆ \star ​​Iterator​ 是一个对象,用于使用 ​​__next__()​​​ 方法对可迭代对象进行迭代。迭代器有 ​​__next__() ​​方法,它返回对象的下一项。

请注意,每个迭代器也是一个可迭代的,但不是每个可迭代的都是一个迭代器。

例如,列表是可迭代的,但列表不是迭代器。可以使用函数 ​​iter() ​​从可迭代对象创建迭代器在这里插入图片描述
为了实现这一点,对象的类需要一个方法 ​​__iter__​​​,它返回一个迭代器,或者一个具有从 0 开始的顺序索引的 ​​__getitem__​​​ 方法。但其本质也是实现了 ​​__iter__​​ 方法。

结束语

感谢阅读吾之文章,今已至此次旅程之终站 🛬。

吾望斯文献能供尔以宝贵之信息与知识也 🎉。

学习者之途,若藏于天际之星辰🍥,吾等皆当努力熠熠生辉,持续前行。

然而,如若斯文献有益于尔,何不以三连为礼?点赞、留言、收藏 - 此等皆以证尔对作者之支持与鼓励也 💞。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ELK 日志分析系统介绍与部署

目录 一、ELK 简介: 1.开源工具介绍&#xff1a; 2.其它组件&#xff1a; 2.1 Filebeat&#xff1a; 2.2 Fluentd&#xff1a; 2.3 缓存/消息队列&#xff08;redis、kafka、RabbitMQ等&#xff09;&#xff1a; 3. filebeat 结合 logstash 带来好处&#xff1a; 二、为什么要…

zookeeper源码学习笔记(一)

一、缘起 1、CP还是AP 作为一个在大数据行业工作了7&#xff5e;8年的老兵&#xff0c;在被问到zookeeper和CAP时&#xff0c;竟然有些恍惚&#xff0c;AP还是CP&#xff1f; 看了一些博文&#xff0c;答案几乎都是CP&#xff1f; zookeeper的实现中&#xff0c;P是一定的&…

【C语言】.c源文件从编译到链接生成可执行程序的过程

本篇文章目录 1. 过程概览2. 编译与链接2.1 预编译/预处理2.2 编译2.3 汇编2.4 链接 3. 执行/运行环境 1. 过程概览 编译到链接是c语言的翻译环境&#xff0c;c语言还有执行环境。 组成一个程序的每个源文件通过编译过程分别转换成目标代码&#xff08;object code&#xff09;…

推荐《一拳超人》

《一拳超人》是ONE原作&#xff0c;村田雄介作画&#xff0c;连载于网络漫画杂志《邻座的Young jump》上的漫画。 [1] 原为ONE在个人网站上连载的练笔之作&#xff0c; [2] 后被喜爱该作的另一漫画家村田雄介在征得ONE同意后重新绘制而成。 简体中文电子版由哔哩哔哩漫画发布…

JavaSE学习值之--认识异常

&#x1f495;"有效知识的前提是承认知识边界&#xff0c;承认我们对边界那边的一切无可奉告。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;JavaSE学习值之--认识异常 一.什么是异常&#xff1f; 异常就是程序在运行的时候产生的不正常的行为 …

java_Stream API

文章目录 一、Stream API vs 集合二、Stream 使用的执行流程2.1、创建Stream2.1、中间操作2.1.1. filter2.1.2. limit2.1.3. skip2.1.4. distinct2.1.5. map2.1.6. sorted 一、Stream API vs 集合 Stream API 关注的是多个数据的计算&#xff08;排序、查找、过滤、映射、遍历…

网络工程师知识点4

51、OSPF的LSA类型 52虚链路&#xff1a;作用 解决区域划分不合理的问题 通过建立虚拟链路来实现一般区域与骨干区域的理论化直连 54、NSSA区域的特点 1、可以学习本区域连接的外部路由 2、不学习其他区域转发进来的外部路由 3、与外部区域通信使用ABR自动产生的默认路…

python:爬取网络小说,看这一篇就够了

说明&#xff1a; 本教程仅供于学习研究使用&#xff0c;请勿用于其他用途。 软件安装&#xff1a; 官网下载visual studio Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com) 点进网页后下拉找到个人免费版本。点击下载即可。 1&#xff1a;找到…

第六章:TF-A学习

TF-A学习 TF-A初探如何获取系统源码移植过程中遇到的问题和解决方案编译报错&#xff1a;arm-none-linux-gnueabi-gcc: not foundTF-A 源码打补丁 遇到assume -R&#xff1f;[n] TF-A初探 为了保证安全 ARM 推出了 Arm Trusted Firmware 的可信固件&#xff0c;简称 TF-A。它…

windows环境cmake的nmake failed

windows环境cmake异常 问题如下&#xff1a; > cmake ..CMake Error at CMakeLists.txt:4 (PROJECT): Running nmake -?failed with:系统找不到指定的文件。CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage CMake Error: CMAKE_CXX_COMPILER not set, after…

中断机制-interrupt和isInterrupted源码分析、中断协商案例

当前线程的中断标识为true&#xff0c;是不是线程就立刻停止&#xff1f; 答案是不立刻停止&#xff0c;具体来说&#xff0c;当对一个线程&#xff0c;调用interrupt时&#xff1a; 如果线程处于正常活动状态&#xff0c;那么会将该线程的中断标志设置为true&#xff0c;仅此…

【C++】:关键字 命名空间 输入输出 缺省参数 函数重载 引用

【本节目标】 C关键字命名空间C输入&输出缺省参数函数重载引用 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等 熟悉C语言之后&#xff0c;对C学习有一定的帮助&#xff0c;本章节主要目标&#xff…

关于面试以及小白入职后的一些建议

面试的本质 面试的过程是一个互相选择的过程&#xff1b;面试官的诉求是&#xff0c;了解应聘者的个人基本信息、工作态度、专业能力及其他综合能力是否与公司招聘岗位匹配&#xff1b;面试者的诉求是&#xff0c;拿下招聘岗位offer&#xff0c;获得工作报酬&#xff1b; 面试…

【go学习笔记】Go errors 最佳实践

文章目录 一、Error Type1. Sentinel Error&#xff08;预定义Error字符串错误值&#xff09;1.1 缺点 2. Error types&#xff08;错误类型&#xff09;2.1 缺点 3. Opaque errors&#xff08;不透明错误&#xff09;3.1 Assert errors for behaviour, not type 二、Handling …

详解RocketMQ消息存储原理

本文基于RocketMQ 4.6.0进行源码分析 一. 存储概要设计 RocketMQ存储的文件主要包括CommitLog文件、ConsumeQueue文件、Index文件。RocketMQ将所有topic的消息存储在同一个文件中&#xff0c;确保消息发送时按顺序写文件&#xff0c;尽最大的能力确保消息发送的高性能与高吞吐…

SpringBoot实战(二十五)集成 Shiro

目录 一、Shiro 简介1.1 Shiro 定义1.2 Shiro 核心组件1.3 Shiro 认证过程 二、SpringBoot集成2.1 集成思路2.2 Maven依赖2.3 自定义 Realm2.4 Shiro 配置类2.5 静态资源映射2.6 AuthController2.7 User 实体2.8 用户接口类2.9 用户接口实现类2.10 OrderController&#xff08;…

手把手教你使用Python从零开始搭建感知器

大家好&#xff0c;今天本文将展示如何从零开始实现神经网络的最基本要素&#xff08;感知器&#xff09;&#xff0c;以及人工智能的基本模块背后的数学原理。 虽然人工智能和机器学习等术语已经成为流行词汇&#xff0c;每天都会听到或谈论这些概念&#xff0c;但它们背后的…

软件开发介绍

一、软件开发整体介绍 作为一名软件开发工程师&#xff0c;我们需要了解在软件开发过程中的开发流程&#xff0c;以及软件开发过程中涉及到的岗位角色&#xff0c;角色的分工、职责&#xff0c;并了解软件开发中涉及到的三种软件环境。 1.1 软件开发流程 第一阶段&#xff1a…

MQTT解读【全网最易懂】

目录 前言 一、MQTT相比于TCP长连接的优势 1、协议更标准 2、MQTT协议制定好了很多利于物联网的功能 3、理解数据内容&#xff0c;用数据产生价值 二、选择MQTT还是TCP长连接透传 1、原始的业务场景 2、端对端M2M场景——无人汽车 3、APP控制设备端场景——智能家居、智…

RK3588的GPU驱动和桌面环境

这里主要是以orange pi 5 plus为对象作一个简单的笔记 首先看rk3588的gpu介绍&#xff0c;它用的是ARM的GPU&#xff0c;支持openGL ES和openCL&#xff08;支持什么其实跟GPU驱动有关&#xff0c;arm官方闭源GPU驱动就只支持这两个&#xff09; opi官方提供了debian的xfce和…