Python高级语法--迭代器和生成器的区别

news2024/12/23 13:58:36

迭代器

在 Python 中,迭代器(iterator)是访问集合元素的一种方式,它可以遍历一个序列中的元素,而无需事先确定序列的大小(即无需全部载入到内存中),且支持惰性求值。使用迭代器可以大大减少内存的开销,提高程序的运行效率。

迭代器提供了一种遍历数据集合的统一接口,可以让我们在访问集合元素时避免直接使用索引,从而使代码更加简洁和易于理解。有迭代器接口的对象可以使用for…in

同时也可以通过内置函数去判断一个类型的变量是否可迭代和是否是迭代器
在这里插入图片描述
以下列举可迭代的数据类型:
在这里插入图片描述

要创建一个迭代器,需要先创建一个可迭代对象(iterable),即实现了 iter() 方法的对象。在这个可迭代对象中,通过定义一个 next() 方法来实现迭代过程。当迭代到最后一个元素后,再次调用 next() 方法时,会触发 StopIteration 异常,表示迭代完成。

例如,可以使用 for 循环来遍历一个列表对象,这里的列表是一个可迭代对象

list_obj = [1, 2, 3, 4, 5]
for i in list_obj:
    print(i)

上述代码中,通过 for 循环遍历了列表对象 list_obj,并输出了其中的每一个元素。

如果需要手动创建一个迭代器,可以使用 iter() 函数来实现,例如:

list_obj = [1, 2, 3, 4, 5]
iter_obj = iter(list_obj)

print(next(iter_obj))  # 输出 1
print(next(iter_obj))  # 输出 2
print(next(iter_obj))  # 输出 3

上述代码先通过 iter() 函数创建了一个迭代器 iter_obj,然后使用 next() 函数来获取每个元素,并输出了这些元素。

除了列表对象,其他的一些对象,比如文件对象,也是可迭代对象,例如:

# 打开一个文件,读取其中的内容
with open('sample.txt', 'r') as f:
    for line in f:
        print(line)

述代码中,通过 with 语句打开了一个文件,然后通过 for 循环和文件对象的迭代接口,遍历了文件中的每一行并输出了它们。

迭代器是 Python 中非常重要且常用的概念,掌握了它的使用方法,可以大大提高程序的效率和灵活性。

生成器

在 Python 中,生成器(generator)是一种特殊的迭代器,它是通过函数来实现的。与普通函数不同的是,生成器函数在执行过程中可以中断,并且可以在需要时继续执行,从而实现了一种基于函数的惰性求值。

生成器函数的特点是在函数体中通过关键字 yield 来定义生成器的迭代内容,每次执行生成器时,函数会从上一次 yield 语句处继续执行,直到遇到下一个 yield 语句或者函数结束。通过这种方式,可以动态地生成数据,而不必将所有数据一次性载入内存,从而减少了内存的开销。

下面给出一个简单的生成器函数的例子,该函数可以生成一个从 0 开始的整数序列:

def generator():
    i = 0
    while True:
        yield i
        i += 1

上述代码中,通过 yield 语句来定义了一个生成器函数,每次生成一个从 0 开始递增的整数,而函数本身并不返回任何值,而是通过 yield 语句来产生数据。该函数无限循环,直到程序被终止或者出现异常。

生成器函数的调用类似于函数的调用,只不过需要将函数名后面的圆括号替换为方括号,例如:

g = generator()
next(g)  # 输出 0
next(g)  # 输出 1
next(g)  # 输出 2

上述代码中,首先创建了一个生成器对象 g,然后调用 next() 函数来获取生成器的下一个值,每次调用时生成器函数都会从上一次执行的位置继续运行,并生成一个新的整数。

生成器在 Python 中的应用非常广泛,比如在处理大数据集、并发编程和协程等方面都有很多的应用。因为生成器提供了一种比较简洁、高效的方法来生成数据,可以在一定程度上优化程序的性能。

迭代器与生成器的区别与联系

迭代器和生成器都是 Python 中用于实现惰性求值的重要机制,它们可以使程序在处理大数据集等情况下更加高效。

迭代器是一种特殊的对象,它可以被用于遍历序列中的元素,而无需事先确定序列的大小。对于迭代器对象,可以通过调用 iter() 函数来进行创建,然后通过 next() 函数来获取序列中的每一个元素,直到序列结束。通常情况下,我们使用 for 循环来遍历迭代器对象,因为 for 循环使用了迭代器对象的相关方法,比如 iter() 和 next() 方法。

而生成器则是一种特殊的函数,它可以实现依次生成惰性计算结果的能力。在生成器函数中,我们使用 yield 语句来实现对序列的依次生成。每次调用生成器函数时,程序会在 yield 语句处暂停执行,并返回一个生成器对象。通过调用生成器对象的 next() 或者 send() 方法,可以使程序从上一次暂停的位置继续执行,并生成下一个值。换句话说,我们可以通过生成器函数来自定义迭代器,而且它更加灵活。

在语法上,迭代器和生成器最大的区别在于,生成器使用关键字 yield 来实现惰性计算,而迭代器没有这个关键字。此外,生成器还可以使用函数的方法来定义,而对于迭代器,我们通常是手动定义 iter() 和 next() 这两个特殊方法来实现。

最后,需要注意的是,虽然迭代器和生成器都可以实现惰性计算,但它们之间还是有一些区别的。迭代器通常更加简单,而且可以在需要时手动控制序列的遍历过程,而生成器则更加灵活和高效,因为它可以在函数内部维护状态,并随时暂停和恢复运行。总之,在不同的场景下,根据实际需求选择使用适当的方法可以使程序更加高效。

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

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

相关文章

程序员 35 岁以后就真的要返乡种田了么?如果家里没田怎么办?

前言 在科技互联网高速发展的当下,程序员这个职业无疑是备受关注的。然而,这个行业似乎总是被一种说法所笼罩:程序员年龄一旦超过35岁,就会面临职业生涯的下坡路,甚至需要考虑“返乡种田”。这种说法是否真实呢&#x…

【Software Testing】【期末习题库】【2023年春】【仅供参考】

文章目录 ①单选②多选③填空④判断⑤大题 类型总分占比平时成绩40%考试/考查60% 题型题量分值备注单选201’多选103’全对3’,错1个0’,少选-1’填空102’判断52’大题210’ 平时习题(3次): ①软件测试概述 ②黑盒测…

【五子棋实战】第5章 开发五子棋前端页面

【五子棋实战】第5章 开发五子棋前端页面 页面设计原则 开发页面 ## 基础HTML骨架 ## 添加页面响应式功能 编写JS ## 获取画布对象与DOM对象 ## 定义棋子、棋盘对象 ## 定义绘画对象(重要!!) ## 初始化绘制棋盘 ## 添加点…

Network 之十三 NC-SI 原理、拓扑结构、RBT 接口及仲裁、协议格式

最近,正在学习 NC-SI 的使用方法,于是开始各种 Google 查找 NC-SI 的资料进行学习。最详细还是得直接看 NC-SI 规范文档 DSP0222,以下就是记录的一些感觉 NC-SI 规范中比较重要的点以及我的一些理解,以备后续查阅。 有任何疑问&am…

OpenGL之模板测试

文章目录 模板测试模板函数物体轮廓源代码 模板测试 当片段着色器处理完一个片段之后,模板测试(Stencil Test)会开始执行,和深度测试一样,它也可能会丢弃片段。接下来,被保留的片段会进入深度测试,它可能会丢弃更多的片…

Git下:Git命令使用-详细解读

目录 一、Git 安装 二、Git 配置 三、Git 工作流程 四、Git 工作区、暂存区和版本库 五、常用 Git 命令清单 1. 创建仓库 2. 增加/删除文件 3. 代码提交 4. 分支管理 5. 标签 6. 查看历史提交 7. 远程仓库同步 8. 撤销操作 六、Git 常用命令速查表 七、Git 电子…

时序预测的深度学习算法全面盘点

1.概述 深度学习方法是一种利用神经网络模型进行高级模式识别和自动特征提取的机器学习方法,近年来在时序预测领域取得了很好的成果。常用的深度学习模型包括循环神经网络(RNN)、长短时记忆网络(LSTM)、门控循环单元&…

第五十一章 协助调查

眼前一个红彤彤的东西缓缓升起。 旭日东升?可现在才升未免太晚了些,升起的速度也未免太快了些,这红日么,也未免太小了些,而且,刚升起的朝阳,也未免显得太红太亮了些。 “是谁呀,水烧…

C语言数据存储 —— 浮点型篇

C语言数据存储 —— 浮点型篇 前言1. 一个常见问题2. 浮点数存储规则2.1 有效数字M一些特别的规定2.2 有效数字E一些特别的规定2.2.1 E如何存入内存2.2.2 E如何从内存中取出 3. 前面问题的解释。4. 结尾 前言 浮点数在内存中的存储方式对程序员来说非常重要。理解浮点数的存储…

数据结构:二叉树经典例题(单选题)-->你真的掌握二叉树了吗?(第一弹)

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关二叉树的经典例题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数…

消防通道堵塞识别 opencv

消防通道堵塞识别系统通过opencvpython网络模型技术,消防通道堵塞识别对消防通道的状态进行实时监测,检测到消防通道被堵塞时,将自动发出警报提示相关人员及时采取措施。OpenCV的全称是Open Source Computer Vision Library,是一个…

linux-centOS7.9通过docker安装cwmp server:drumsergio/genieacs

一、安装环境 #查看centOS版本 [rootMiWiFi-R4CM-srv network-scripts]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) #自动查找最新安装包并升级 [rootMiWiFi-R4CM-srv ~]# sudo yum upgrade 二、关闭firewalld、NetworkManager、selinux 关闭防火墙、…

【黑马头条-Java微服务项目】

黑马头条-Java微服务项目 (一)、项目介绍1.项目背景介绍(1).基本介绍(2).业务说明(3).项目术语介绍 2.技术栈说明(1).技术栈-基础六层技术(2).技术栈-服务四层技术(3).技术栈-分布 (二)、nacos环境搭建 (一)、项目介绍 1.项目背景介绍 (1).基本介绍 随着智能手机的普及&…

在线选课的微信小程序(微信前端+网站后端)

目录 一、前言 二、微信小程序端(老师、学生) 1.学生用户前端小程序界面 2.老师前端小程序界面 三、后端(管理员、老师、学生) 3.老师后端 4.管理员后端 四、代码获取与调试 一、前言 这是一个在线选课的微信小程序&#…

PID控制算法: 3、Tuning Changes(参数调整)

改变控制参数积分项对输出结果的影响 可靠的控制系统应该有能力实时变更系统的参数 The Beginner’s PID acts a little crazy if you try to change the tunings while it’s running. Let’s see why. Here is the state of the beginner’s PID before and after the param…

STM32F4 点亮灯泡【顺序点亮、按键点亮】

一、顺序点亮灯泡 ①初始化 在user.c文件中,我们需要对LED进行初始化设置。 在函数LED_GPIO_Config中,可以修改代码如下: /*********************************************************************** LED初始化 备注 LED 接在GPC14引脚上…

【Springboot集成Neo4j完整版教程】

🚀 Neo4j 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,C…

基于Python+OpenCV图像识别的连连看辅助工具(深度学习+机器视觉)含全部工程源码及视频演示

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境Pycharm 环境 模块实现1. 获取句柄2. 图像划分3. 建立矩阵4. 矩阵求解 系统测试工程源代码下载其它资料下载 前言 本项目目标是利用pywin32来获取游戏图像信息,并利用OpenCV进行识别和处理&#xff…

2023学习日志

[牛客网习题练习] 此系列文章仅是对个人学习的记录如有错误望大家指正与谅解。 1.题目描述:输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出…

文本分析-使用Python做词频统计分析

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…