python迭代器(Iterator)_python iterator-程序员宅基地

技术标签: python  后端  开发语言  

背景:

在python中,有很多对象都可以通过for循环来对其中的每一个元素进行访问,比如list、dict、string等,这些对象被称为可迭代对象

什么是迭代器

迭代器(Iterator)是访问集合内元素的一种方式,提供了一种遍历序列对象的方法。用来迭代操作对象,可以像列表一样,迭代的获取其中的每一个元素,任何实现了__next__方法的对象,都可以称之为迭代器。

迭代器的特点

__iter__方法返回迭代器本身;

next()方法返回容器的下一个元素

当没有下一个元素时,会报出StopIteration异常

与列表的区别

构建迭代器的时候,不需要像列表一样,把所有的元素一次性加载到内存,而是通过使用延迟计算(lazy evaluation)的方式返回元素,这是迭代器的优点之一。

举例:如果一个列表包含一千万个整数,需要占用400M的内存,如果使用迭代器,只需要几十字节的内存。因为迭代器没有把所有元素加载到内存,而是调用迭代器的next方法时才返回该元素。

迭代器的例子

alist = [1,2,3,4]
it = iter(alist)

这里创建了一个列表,然后使用了iter()方法实现了迭代器。

打印看一下是不是迭代器类型:

print(it)
<list_iterator object at 0x00000219B162C8E0>

那么如何遍历迭代器里面的元素呢,下面是一些方法。

当我们使用next()方法时,会按顺序返回迭代器中的元素,比如第一次调用next方法,返回列表中的元素1,第二次调用next方法,会返回列表中第二个元素2。

print(next(it))
print(next(it))
1
2

那么如何遍历所有的元素呢,每一次都用next不太现实,这里就要用到循环,第一种方式while循环:

 while True:
     try:
         print(next((it)))
     except StopIteration:
         break
1
2
3
4

注意,这里用while(True)不断的取出迭代器中的元素,但是当超出范围时,会报出StopIteration异常,所以这里用Try-expect来捕获异常。

第二种方式:利用for循环

 for item in it:
     print(item)

直接利用for-in结构,取出迭代器中的每一个元素,然后输出,很明显比上面一种方法简洁很多。

如果需要在遍历的同时取出元素的索引值,只需要使用enumerate即可,和一般的列表之类的遍历相同:

for index,item in enumerate(it):
    print(index,item)

接下来让我们自己编写一个迭代器的类

class Fib:
    def __init__(self,n):
        self.prev = 0
        self.cur = 1
        self.n = n
        print(self.n)
    def __iter__(self):
        return self
    def __next__(self):
        if self.n>0:
            value = self.cur
            self.cur = self.cur + self.prev
            self.prev = value
            self.n-=1
            return value
        else:
            raise StopIteration()
f = Fib(10)
for item in f:
    print(item)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_28790663/article/details/122425181

智能推荐

Seaborn:一个样式更好看的Python数据可视化库_seaborn库-程序员宅基地

文章浏览阅读1.6k次,点赞48次,收藏23次。Seaborn 是一个基于 Matplotlib 的 Python 数据可视化库,它提供了更高级别的界面和更优雅的默认样式,使得用户能够更轻松地创建各种各样的统计图形。Seaborn 的全名是 “Statistical Data Visualization”,它的目标是使数据可视化更加简单、直观和有效。高度易用:Seaborn 提供了一组高级 API,使得用户可以轻松地创建各种统计图形,而无需关心底层的实现细节。美观的默认样式:Seaborn 提供了一套美观的默认样式,使得生成的图形更具视觉吸引力。_seaborn库

前端代码复用学习笔记:整洁架构与清晰架构_后端复用前端代码-程序员宅基地

文章浏览阅读1.3k次。UI 设计师的最终产出由少部分 视觉要素约定 +设计师个人 主观设计倾向 决定,也就是说,设计师的心情好坏和人员更替会直接影响每次产出设计稿的呈现,这对设计师来说很正常,但对前端工程师来说是致命的基于此,我们需要在工具上。_后端复用前端代码

grib中数据读取并导出到文本文件中_grib格式转换成txt-程序员宅基地

文章浏览阅读1.1w次。最近忙着赶项目加上家里的事比较多,就没有来得及更新博客,今天主要讲解一下grib数据的查看方法和读取方法。grib数据没有找到好的可视化工具打开它,官网提供的一个可视化工具叫Metview,此工具的安装过程相当的复杂,搞了将近3个小时最后还是没有安装成功,由于项目比较紧就果断的先放弃啦。这种方法不行,还可以使用ecCodes提供的自带命令行方式把grib数据中的一条一条的消息导出到一个.txt文件..._grib格式转换成txt

QT常用编码转换_qt字符编码转换-程序员宅基地

文章浏览阅读381次。【代码】QT常用编码转换。_qt字符编码转换

网络篇01 | 入门篇-程序员宅基地

文章浏览阅读1.2k次,点赞18次,收藏24次。应用层:提供用户接口和服务的应用程序。表示层:处理数据格式转换、加密解密等功能。会话层:管理通信会话,确保数据传输的正确性。

Entering emergency mode. Exit the shell to continue._linux系统提示entering emergency mode. exit the shell t-程序员宅基地

文章浏览阅读545次。Linux虚拟机复制到另外一台AMD的机器上,启动后直接进入emergency模式。解决方式如下:解决问题:journalctl可以查看错误原因和解决办法。输入命令:#umount /dev/dm-0#xfs_repair -v -L /dev/dm-0【-L 选项指定强制日志清零,强制xfs_repair将日志归零,即使它包含脏数据(元数据更改)。】#reboot..._linux系统提示entering emergency mode. exit the shell to continue. type

随便推点

计算机导论各章节总结,计算机导论第十三周课后总结(示例代码)-程序员宅基地

文章浏览阅读199次。一.计算机网络定义:将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,实现资源共享和信息传递的计算机系统。网络分类:(1) 按网络的地理覆盖范围可分为局域网,城域网和广域网。(2)按照网络传输媒体划分可分为有线网和无线网3.计算机网络的硬件组成(1) 网络传输媒体:双绞线、同轴电缆,光纤及无线通信等。局部使用双绞线、同轴电缆,网速要求比较高的haul,使用光纤,..._计算机导论速成课笔记

Python replace()函数使用详解:字符串的艺术转换-程序员宅基地

文章浏览阅读745次,点赞31次,收藏13次。在本文中,我们将深入探讨Python中replace()函数的用法,探讨如何在字符串操作中灵活运用这一功能,使得字符串转换变得轻而易举。对于想要在Python中进行字符串替换的开发者来说,这将是一个极具价值的指南。替换方法优点缺点基本替换简单易懂,适用于一般场景无法限定替换次数限定替换次数可以精确控制替换的次数,灵活应用对于大规模替换可能略显繁琐链式替换代码简洁,逻辑清晰多次替换可能会降低代码的可读性通过本文的学习,我们深入了解了Python中replace()

PAT 甲级 1001(A+B Format)-程序员宅基地

文章浏览阅读81次。PAT 甲级 1001题目要求翻译代码思路题目要求Calculate a+b and output the sum in standard format – that is, the digits must be separated into groups of three by commas (unless there are less than four digits).Input Sp...

决策树后剪枝算法(一)代价复杂度剪枝CPP-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏36次。剪枝,是一个“用准确性换取简单性”的思想。它允许决策树对训练集过拟合,再通过删除对泛化精度无贡献的子分支,从而修剪出一颗较小的树。_代价复杂度剪枝

268道Go语言面试真题及详解+100例代码实例+DDD实践-程序员宅基地

文章浏览阅读1.2k次。Go最近动静挺大的,刚刚发布的1.18包含以下几大特性:1、泛型2、模糊测试(Fuzzing)3、工作空间(Workspaces)4、20% 性能提升:Apple M1、ARM64 和 PowerPC64 用户开心了!由于 Go 1.17 的寄存器 ABI 调用约定扩展到这些架构,Go 1.18 包括高达 20% 的 CPU 性能改进。没错,过往Go被诟病最多的泛型,现在..._go语言面试题

软考中级 软件设计师资料(考点分析+复习笔记+历年真题+电子版课本)_软件设计师中级资料-程序员宅基地

文章浏览阅读3.8w次,点赞755次,收藏1.2k次。软件设计师是软考中级职称,相比高级的难度而言,中级难度较低,每个人花些时间都能顺利通过的,考试分为上午的选择题和下午的综合题,这里跟大家分享一些自己备考时使用的资料和经验一、先对自己进行评估:因为每个人的知识点掌握情况和学校教学内容的不一致,这里以我个人情况进行说明,大家做个参考就行:大家先了解一下软件设计师的考纲:有些同学刚看到考纲会有一些迷茫,感觉很多东西都没学过,没关系,没关系,没学过的也没关系!大家要明白一点,软件设计师考察的内容广度比较高,也就是内容多、杂,但是深度很浅!,也就是没学过_软件设计师中级资料

推荐文章

热门文章

相关标签