一语道破 python 迭代器和生成器

简而言之:迭代器是一个抽象化的概念,在python中表示访问数据集合中元素的一种方式;生成器也是一个抽象化的概念,在python 中,边循环边生成所需数据,是一种时间换空间的方法。从访问数据方式上来看:生成器是一种特殊的迭代器。

目录

一、迭代和可迭代对象

1、 什么是迭代:

2、什么是可迭代对象:

二、迭代器

三、生成器

四 、使用场景和总结


一、迭代和可迭代对象

1、 什么是迭代:

  • 迭代:迭代是通过循环结构(如 for 循环、while 循环等)来实现重复执行代码的方法。程序会根据条件或计数器的变化,反复执行一段代码,直到满足某个终止条件为止。

  • 递归:递归是通过函数调用自身来解决问题的方法。函数在执行过程中会不断地调用自己,直到遇到终止条件才停止递归。

2、什么是可迭代对象:

如 list、tuple、dict、set、str、range、enumerate 等这些可以直接用于 for 循环的对象称为可迭代(Iterable)对象,也即它们是可迭代的

  • 可迭代对象,需要提供 __iter__()方法,否则不能被 for 语句处理。

iter() 内建方法可以把list、dict、str等可迭代对象转换成迭代器

除字典外,一个对象只要实现了 __getitem__() 方法,就认为它是序列类型,序列类型总是可迭代的。对于序列类型,字典,还有更复杂的可迭代类型如 range,Python 内建了对应的迭代器对它们进行迭代操作,它们无需实现 __next__() 方法,iter() 函数会返回对应的内建迭代器。

二、迭代器

迭代器通过类来实现,在类中需要定义两个方法  __iter__() 和 __next__()方法

__iter__() 方法返回迭代器对象自身,

 __next__() 方法返回下一个元素的值,在没有更多元素可提供时引发 StopIteration 异常

class MyIterator:def __init__(self, data):self.data = dataself.index = 0def __iter__(self):return selfdef __next__(self):if self.index < len(self.data):value = self.data[self.index]self.index += 1return valueelse:raise StopIteration# 使用自定义迭代器
my_list = [1, 2, 3, 4, 5]
my_iterator = MyIterator(my_list)for num in my_iterator:print(num)

三、生成器

如果我们要处理更多元素,那么所占内存就呈线性增大,所以受到内存限制,列表容量是有限的。通常我们并不会一次处理所有元素,而只是集中在其中的某些相邻的元素上。所以如果列表元素可以用某种算法用已知量推导出来,就不必一次创建所有的元素。这种边循环边计算的机制,称为生成器(generator),生成器是用时间换空间的典型实例。

生成器通常由两种方式生成,用小括号()表示的生成器表达式(generator expression)和生成器函数(generator function)

生成器表达式和生成器函数产生生成器时,会自动生成名为 __iter__ 和 __next__ 的方法

下面关于生成器表达式和生成器函数的代码,来源于链接3

list0 = [x * x for x in range(5)]
print(list0)list_generator0 = (x * x for x in range(5))
print(list_generator0)list_generator1 = (x * x for x in range(5000000))
print(sys.getsizeof(list_generator0))
print(sys.getsizeof(list_generator1))>>>
[0, 1, 4, 9, 16]
<generator object <genexpr> at 0x000002C7B9955B48>
88
88
def fibonacci(n):i, j = 0, 1while(i < n):print(i, end=' ')i, j = j, i + jfibonacci(5)
print(type(fibonacci))
>>>
0 1 1 2 3 <class 'function'>

四 、使用场景和总结

  • 迭代器通常用于对列表、元组、字典等数据结构进行遍历。它们适用于已知数据集合且数据量不太大的情况。
  • 生成器适用于需要动态生成数据的情况,尤其是当数据集合非常大或是无限的时候。生成器按需生成数据,可以节省内存和提高性能

总结起来,迭代器是一种数据访问模式的抽象概念,用于按序访问集合中的元素,它可以由自定义的迭代器对象或 Python 内置的可迭代对象生成。而生成器是一种特殊的函数或表达式,用于按需生成数据,并保存状态以支持断续生成。生成器是一种特殊的迭代器,通常用于处理大数据集或无限序列,以节省内存并提高性能。

参考链接:

https://www.runoob.com/python3/python3-iterator-generator.htmlhttps://www.runoob.com/python3/python3-iterator-generator.html

https://blog.csdn.net/be5yond/article/details/119344030https://blog.csdn.net/be5yond/article/details/119344030

https://pythonhowto.readthedocs.io/zh_CN/latest/iterator.html#id10https://pythonhowto.readthedocs.io/zh_CN/latest/iterator.html#id10部分代码和文章来源ChatGPT.

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

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

相关文章

[数据集][目标检测]遛狗不牵绳数据集VOC格式-1980张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;1980 标注数量(xml文件个数)&#xff1a;1980 标注类别数&#xff1a;5 标注类别名称:["dog","p…

Qt编写自定义控件:自定义表头实现左右两端上部分圆角

如上图&#xff0c;左上角和右上角凸出来了。设置表格圆角和表头圆角和QHeaderView::section圆角都不管用。解决此问题需要重写QHeaderView的paintSection()函数&#xff1a; class CustomHeaderView : public QHeaderView { public:explicit CustomHeaderView(Qt::Orientati…

NsPack3.x脱壳手记

发现是NsPack3.x的壳 使用ESP守恒快速脱壳 F9遇到popfd后下面的jmp就是通往OEP了 打开LordPE准备转储映像, 首先调整下ImageSize, 接着dump full 接着不要退出目前的调试, 打开Scylla修复IAT, 把OEP的VA地址输入到OEP处, 接着按照如下图所示步骤 完成后如下, 但NsPack3.x…

shell命令

#!/bin/bash read -p "请输入一个文件名&#xff1a;" fileName posexpr index $fileName \. typeexpr substr $fileName $((pos1)) 2if [ $type sh ] thenif [ -x $fileName ]thenbash $fileNameelsechmod ax $fileNamefi firead -p "请输入第一个文件名&…

【LeetCode】226.翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例 3…

opencv 30 -图像平滑处理01-均值滤波 cv2.blur()

什么是图像平滑处理? 图像平滑处理&#xff08;Image Smoothing&#xff09;是一种图像处理技术&#xff0c;旨在减少图像中的噪声、去除细节并平滑图像的过渡部分。这种处理常用于预处理图像&#xff0c;以便在后续图像处理任务中获得更好的结果。 常用的图像平滑处理方法包括…

21.Netty源码之编码器

highlight: arduino-light Netty如何实现自定义通信协议 在学习完如何设计协议之后&#xff0c;我们又该如何在 Netty 中实现自定义的通信协议呢&#xff1f;其实 Netty 作为一个非常优秀的网络通信框架&#xff0c;已经为我们提供了非常丰富的编解码抽象基类&#xff0c;帮助我…

Qt视频播放器

一、设置好ui界面二、打开文件槽函数1.QDir::homePath()作用介绍2.QFileDialog::getOpenFileName()介绍3.QFileInfo介绍4.player 指针解释5.打开文件槽函数完整代码 三、视频播放器初始化1.QMediaPlayer()函数2.设置时间间隔的作用3. QGraphicsScene介绍4.QGraphicsVideoItem介…

高性能网络框架笔记

目录 TCP粘包、分包惊群断开连接&#xff0c;TCP怎么检测的&#xff1f;大量的close wait&#xff0c;如何解 ?双方同时调用close水平触发和边沿触发的区别 TCP粘包、分包 解决&#xff1a;1.应用层协议头前面pktlen&#xff1b;2.为每一个包加上分隔符&#xff1b;(\r\n&…

Docker网络模型使用详解(2)Docker网络模式

安装Docker时会自动创建3个网络&#xff0c;可以使用docker network ls命令列出这些网络。 [rootlocalhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE ebcfad6f4255 bridge bridge local b881c67f8813 compose_lnmp_lnmp…

逆向时如何找到MingGW(GNU)编译程序的main函数

编译器是MingGW生成的可执行文件的显著特点是, 最终运行ZwContinue后程序就莫名其妙启动了, 也找不到main函数。 为了探究里面究竟怎么回事, 我找到了wrk-v1.2的源码, 其中包含了ZwContinue的实现, 首先先看一下注释, API界面包含了2个参数, 其中让人感兴趣的是PCONTEXT, 这是…

答辩PPT怎么做?在线PPT软件哪个好?

又是一年毕业季&#xff0c;相信很多毕业生都开始准备论文答辩&#xff0c;有些同学正在为论文奋夜苦战&#xff0c;有些则是为论文答辩PPT而烦恼。做PPT要用什么软件好呢&#xff1f;这篇文章就来告诉你。 当下有很多PPT制作工具&#xff0c;其中自然也包括Office三件套。这些…