Python 迭代器与生成器

简介

迭代是Python访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象,而生成器则是实现迭代器协议的生成数据的简单函数。迭代器只能往前不会后退,而生成器可以。迭代器和生成器都是Python中强大的数据类型,具有惰性计算的特点,即不会立即产生所有结果,而是逐步产生。

迭代器(Iterator)

迭代器是一个对象,可以用来遍历可迭代对象(如列表、元组、字典等)中的元素。迭代器是一个具有__next__方法的对象,每次调用__next__方法时,迭代器会返回它的下一个值。如果迭代器没有更多的值可以返回,调用__next__方法会引发一个StopIteration异常。迭代器只能往前不会后退,这意味着无法重新访问已经遍历过的元素。迭代器可以用于遍历大型数据集,因为它们在内存中只存储一个元素,而不是一次性加载整个数据集。

__iter__方法返回迭代器本身,通常是self。
__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):raise StopIteration  # 抛出异常value = self.data[self.index]self.index += 1return valuemy_iter = MyIterator([1, 2, 3, 4, 5])
for item in my_iter:print(item)

二叉树中序遍历

# 定义二叉树节点类
class BinaryTree(object):def __init__(self, value, left=None, right=None):self.value = value  # 节点值self.left = left  # 左子树self.right = right  # 右子树def __iter__(self):return InorderIterator(self)# 定义中序遍历的迭代器类
class InorderIterator(object):def __init__(self, node):self.node = node  # 当前节点self.stack = []  # 用于辅助中序遍历的栈def __next__(self):# 如果栈非空或者当前节点非空if len(self.stack) > 0 or self.node is not None:while self.node is not None:self.stack.append(self.node)  # 将当前节点入栈self.node = self.node.left  # 移动到左子树node = self.stack.pop()  # 弹出栈顶节点self.node = node.right  # 移动到右子树return node.value  # 返回节点的值else:raise StopIteration()  # 遍历完成时抛出异常# 创建一个二叉树
tree = BinaryTree(left=BinaryTree(left=BinaryTree(1),value=2,right=BinaryTree(left=BinaryTree(3),value=4,right=BinaryTree(5)),),value=6,right=BinaryTree(value=7,right=BinaryTree(8))
)for value in tree:print(value)

上述代码定义了一个二叉树和中序遍历的迭代器,然后使用迭代器来遍历树的节点并打印节点的值。

生成器(Generator)

生成器是一种特殊的迭代器,可以通过函数来创建。生成器函数使用yield关键字来产生值,而不是使用return。实际上,生成器是实现迭代器协议的生成数据的简单函数,本质上属于迭代器。生成器用于“凭空”生成元素,每次调用生成器的函数时,它都会计算一个新的值,并将其添加到结果集中。生成器函数在每次调用时不会重新启动,而是从上一次yield语句的位置继续执行。生成器在迭代时会自动管理状态,不需要手动实现 __iter____next__方法。

简单示例

def my_generator(data):for item in data:yield itemgen = my_generator([1, 2, 3, 4, 5])
for item in gen:print(item)

二叉树中序遍历

# 定义二叉树节点类
class BinaryTree(object):def __init__(self, value, left=None, right=None):self.value = value  # 节点的值self.left = left  # 左子树self.right = right  # 右子树# 使用生成器实现中序遍历的函数
def traversal(node):if node is not None:yield from traversal(node.left)  # 递归左子树yield node.value  # 生成当前节点的值yield from traversal(node.right)  # 递归右子树# 创建一个二叉树
tree = BinaryTree(left=BinaryTree(left=BinaryTree(1),value=2,right=BinaryTree(left=BinaryTree(3),value=4,right=BinaryTree(5)),),value=6,right=BinaryTree(value=7,right=BinaryTree(8))
)# 使用生成器进行中序遍历并打印节点值
for value in traversal(tree):print(value)

总结

总而言之,Python的迭代器是一种可以遍历集合中元素的对象,必须实现__iter____next__方法。__iter__返回迭代器自身,__next__用于获取下一个元素,当没有元素可迭代时,会引发StopIteration异常。

生成器则是一种特殊的迭代器,使用函数中的yield关键字来生成值,但不会中断函数的执行。生成器提供了一种更简洁的方式来创建可迭代对象,它按需生成元素,因此可以节省内存。生成器函数在每次调用yield时会保存当前状态,以便下次从相同位置继续执行,使得迭代更加灵活和高效,在处理大规模数据集时非常有用。

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

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

相关文章

canvas绘制不同样式的六角星(示例源代码)

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

(2)(2.1) Andruav Android Cellular(一)

文章目录 前言 1 Andruav 是什么? 2 Andruav入门 3 Andruav FPV 4 Andruav GCS App​​​​​​​ 前言 Andruav 是一个基于安卓的互联系统,它将安卓手机作为公司计算机,为你的无人机和遥控车增添先进功能。 1 Andruav 是什么&#xff…

抽象类(没有对象)之引用对象失败之谜

👨‍💻作者简介:👨🏻‍🎓告别,今天 📔高质量专栏 :☕java趣味之旅 欢迎🙏点赞🗣️评论📥收藏💓关注 💖衷心的希…

C语言中的字符串操作函数自定义实现:标准版与限定长度版

目录 1. 标准字符串操作函数自定义实现 (a) 自定义strcpy函数 (b) 自定义strcat函数 (c) 自定义strcmp函数 2. 限定长度字符串操作函数自定义实现 (a) 自定义strncpy函数 (b) 自定义strncat函数 (c) 自定义strncmp函数 对字符串的操作是不可或缺的一部分。标准库提供了…

基于Vue+Canvas实现的画板绘画以及保存功能,解决保存没有背景问题

基于VueCanvas实现的画板绘画以及保存功能 本文内容设计到的画板的js部分内容来源于灵感来源引用地址,然后我在此基础上,根据自己的需求做了修改,增加了其他功能。 下面展示了完整的前后端代码 这里写目录标题 基于VueCanvas实现的画板绘…

【Python】遥感数据趋势分析Sen+mk

方法介绍 1.Theil-Sen Median方法又被称为 Sen 斜率估计,是一种稳健的非参数统计的趋势计算方法。该方法计算效率高,对于测量误差和离群数据不敏感,常被用于长时间序列数据的趋势分析中。对于后续代码计算结果中的slope.tif解读,当slope大于…

ycsb压测mongodb

下载解压 https://github.com/brianfrankcooper/YCSB/releases/download/0.17.0/ycsb-mongodb-binding-0.17.0.tar.gz tar -zxvf ycsb-mongodb-binding-0.17.0.tar.gzycsb提前已经在workload文件夹下准备好了几个压测场景分别对应workload[a:f] workloads/workloada 样例 …

微电网优化MATLAB:火鹰优化算法(Fire Hawk Optimizer,FHO)求解微电网优化(提供MATLAB代码)

一、火鹰优化算法FHO 火鹰优化算法(Fire Hawk Optimizer,FHO)由Mahdi Azizi等人于2022年提出,该算法性能高效,思路新颖。 单目标优化:火鹰优化算法(Fire Hawk Optimizer,FHO&#…

[Linux 进程(五)] 程序地址空间深度剖析

文章目录 1、前言2、什么是进程地址空间?3、进程地址空间的划分4、虚拟地址与物理地址的关系5、页表的作用扩展 6、为什么要有地址空间? 1、前言 Linux学习路线比较线性,也比较长,因此一个完整的知识点学习就会分布在两篇文章中&…

【Python程序开发系列】一文搞懂argparse模块的常见用法(案例+源码)

一、引言 argsparse是python的命令行解析的标准模块,内置于python,不需要安装。这个库可以让我们直接在命令行中就可以向程序中传入参数并让程序运行。 在运行深度学习程序时。往往会因为电脑配置不行导致程序运行慢卡,需要将程序在虚机上进行…

Dubbo使用详解

简介 Dubbo是一个高性能、轻量级的开源Java RPC框架,由阿里巴巴公司开发并开源。它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。Dubbo使得应用可通过高性能的 RPC 实现服务的输出和输…

浅聊雷池社区版(WAF)的tengine

雷池社区版是一个开源的免费Web应用防火墙(WAF),专为保护Web应用免受各种网络攻击而设计。基于强大的Tengine,雷池社区版提供了一系列先进的安全功能,适用于中小企业和个人用户。 Tengine的故事始于2011年,…

解析Transformer模型

原文地址:https://zhanghan.xyz/posts/17281/ 进入Transformer RNN很难处理冗长的文本序列,且很容易受到所谓梯度消失/爆炸的问题。RNN是按顺序处理单词的,所以很难并行化。 用一句话总结Transformer:当一个扩展性极佳的模型和一…

springcloud Client端cloud-consumer-order80

文章目录 简介建立module修改pom修改yml主启动类把公共代码写在一个mudule 里面测试 简介 这个是和之前的8001相互配合端口测试 这里的80的用户测试端口。 代码在:GitHub 上:https://github.com/13thm/study_springcloud/tree/main/days2 建立module …

完美解决idea一直indexing,无法操作的问题

今天主要分享一下在使用idea 2020.3版本开发maven项目的时候,一直出现有效件index, 有时候是scaning indexing, 有时候是update indexing, indexing的时候,idea基本上就没办法操作了,连跳入到类或方法里都跳不了。不厌其烦。 于是…

几种常见的算法

一、冒泡排序法 冒泡排序法 原始数据&#xff1a;3 2 7 6 8 第1次循环&#xff1a;&#xff08;最大的跑到最右边&#xff09; 2 3 7 6 8&#xff08;3和2比较&#xff0c;2<3 所以2和3交换位置&#xff09; 2 3 7 6 8&#xff08;3和7比较&#xff0c;3<7 所以不需要交…

【go】依赖倒置demo

文章目录 前言1 项目目录结构&#xff1a;2 初始化函数3 router4 api5 service6 dao7 Reference 前言 为降低代码耦合性&#xff0c;采用依赖注入的设计模式。原始请求路径&#xff1a;router -> api -> service -> dao。请求的为实际方法&#xff0c;具有层层依赖的…

模型Model:字符串列表模型QStringListModel

一、QStringListModel &#xff08;1&#xff09;功能&#xff1a;处理字符串列表的数据模型&#xff0c;可作为QListView的数据模型&#xff0c;在界面上显示和编辑字符串列表。 二、QStringListModel 类中的函数 1)、 QStringListModel(QObject *parent Q_NULLPTR) //构造函…

工程监测仪器振弦采集仪的新技术研究与创新方面

工程监测仪器振弦采集仪的新技术研究与创新方面 工程监测仪器振弦采集仪是一种用于测量和监测工程结构振动特性的仪器。传统的振弦采集仪主要采用振弦传感器和数据采集设备&#xff0c;通过对结构振动信号的采集和分析&#xff0c;可以获得结构的动态特性&#xff0c;如固有频…

【01】mapbox js api加载arcgis切片服务

需求&#xff1a; 第三方的mapbox js api加载arcgis切片服务&#xff0c;同时叠加在天地图上&#xff0c;天地图坐标系web墨卡托。 效果图&#xff1a; 形如这种地址去加载http://zjq2022.gis.com:8080/demo/loadmapboxtdt.html 思路&#xff1a; 需要制作一个和天地图比例…