初识迭代器(Iterator)——迭代器模式——迭代加深(后续更新...)

学习网页:

Welcome to Python.orgicon-default.png?t=N7T8https://www.python.org/

迭代器(Iterator)

迭代器是一个非常有用的Python特性,它允许我们遍历一个容器(如列表、元组、字典、集合等)的元素。迭代器提供了一种方法,可以逐个访问这些元素,而不需要一次性加载所有元素到内存中。

迭代器实现了两个关键的方法:__iter__() 和 __next__()

  • __iter__() 方法返回迭代器对象本身。
  • __next__() 方法返回容器的下一个值。当容器中没有更多元素时,它将引发 StopIteration 异常。

这是一个简单的迭代器示例,该迭代器产生从0到给定数字的平方:

class Squares:  
    def __init__(self, max):  
        self.max = max  
        self.n = 0  
  
    def __iter__(self):  
        return self  
  
    def __next__(self):  
        if self.n < self.max:  
            result = self.n ** 2  
            self.n += 1  
            return result  
        else:  
            raise StopIteration  
  
# 使用这个迭代器  
squares = Squares(5)  
print(list(squares))  # 输出: [0, 1, 4, 9, 16]


在上面的例子中,__iter__() 方法返回迭代器对象本身,而 __next__() 方法则负责生成下一个平方数。当所有的平方数都被生成后,__next__() 方法引发一个 StopIteration 异常,表示迭代已经结束。

在Python中,你可以使用 for 循环来使用迭代器。当你使用 for 循环遍历一个容器时,Python会自动为这个容器创建一个迭代器,并使用 __next__() 方法逐个访问容器的元素。当 __next__() 方法引发 StopIteration 异常时,for 循环自动停止。

总而言之,

迭代器是一个强大的工具,它使得我们能够遍历各种数据结构,如列表、元组、字典、集合等,而无需一次性将所有元素加载到内存中。通过使用迭代器,我们可以逐个访问元素,而不是一次性加载所有元素。

在Python中,迭代器实现了两个关键的方法:__iter__() 和 __next__()__iter__() 方法返回迭代器对象本身,而 __next__() 方法则负责返回容器的下一个值。当容器中没有更多元素时,__next__() 方法将引发 StopIteration 异常,表示迭代已经结束。

我们可以自定义迭代器类来满足特定的需求。例如,上面的示例展示了一个名为 Squares 的迭代器类,它生成从0到给定数字的平方。我们可以使用 for 循环来使用这个迭代器,Python会自动调用 __next__() 方法来逐个访问平方数。当所有的平方数都被访问后,__next__() 方法引发 StopIteration 异常,for 循环自动停止。

使用迭代器可以节省内存空间,因为它允许我们逐个访问元素,而不是一次性加载所有元素。此外,迭代器还提供了更灵活的遍历方式,我们可以使用 while 循环和手动调用 __next__() 方法来遍历容器。

迭代器模式

迭代器模式是一种行为型设计模式,它提供了一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

在迭代器模式中,主要有以下几个参与者:

  1. Iterator(迭代器):迭代器定义访问和遍历元素的接口。
  2. ConcreteIterator(具体迭代器):具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置。
  3. Aggregate(聚合):聚合定义创建相应迭代器对象的接口。
  4. ConcreteAggregate(具体聚合):具体聚合实现聚合接口,定义了创建相应迭代器对象的接口。
迭代器模式的主要优点包括:
  1. 简单性:通过使用迭代器,我们可以更简单地遍历容器中的元素,而无需了解容器的内部实现。
  2. 封装性:迭代器模式将对象的内部结构和遍历的过程都封装在迭代器中了,增加了系统的稳定性和可维护性。
  3. 抽象性:通过使用迭代器,我们可以抽象地处理不同类型的容器,而无需关心具体的容器实现。

然而,迭代器模式也有一些缺点

  1. 增加了系统的复杂性:使用迭代器模式需要额外的代码来实现迭代器和聚合类,增加了系统的复杂性。
  2. 性能问题:使用迭代器模式可能会比直接使用循环语句更慢,因为需要调用额外的函数和方法。
  3. 内存开销:由于需要创建额外的迭代器和聚合对象,因此可能会增加内存开销。

总之,迭代器模式是一种非常有用的设计模式,它提供了一种简单、封装性和抽象性的方法来遍历容器中的元素。但是,在使用时需要注意其缺点和限制。

迭代器模式是一种行为型设计模式,它提供了一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

”举个Java栗子“

以下是一个使用迭代器模式的简单例子(Java)

假设我们有一个班级,班级中有多个学生。我们想要遍历班级中的所有学生,并打印每个学生的姓名。

首先,我们定义一个迭代器接口:

public interface StudentIterator { 
boolean hasNext(); 
String next(); 
}

然后,我们定义一个班级类,该类实现了迭代器接口:


	public class Classroom implements StudentIterator { 

	private List<String> students; 

	private int currentIndex; 

	


	public Classroom(List<String> students) { 

	this.students = students; 

	this.currentIndex = 0; 

	} 

	


	@Override 

	public boolean hasNext() { 

	return currentIndex < students.size(); 

	} 

	


	@Override 

	public String next() { 

	if (hasNext()) { 

	return students.get(currentIndex++); 

	} else { 

	throw new NoSuchElementException("No more students in the class."); 

	} 

	} 

	}
现在,我们可以使用迭代器来遍历班级中的所有学生:
List<String> students = Arrays.asList("Alice", "Bob", "Charlie"); 
Classroom classroom = new Classroom(students); 
while (classroom.hasNext()) { 
System.out.println(classroom.next()); 
}

输出结果为:

Alice
Bob
Charlie

在这个例子中,我们定义了一个班级类,该类实现了迭代器接口。在迭代器接口中,我们定义了hasNext()next()方法,用于判断是否还有下一个元素和获取下一个元素。在班级类中,我们实现了这两个方法,并使用一个列表来存储学生姓名。然后,我们使用一个while循环来遍历班级中的所有学生,并打印每个学生的姓名。

”举个Python栗子“
class TreeNode:  
    def __init__(self, value):  
        self.value = value  
        self.children = []  
  
class TreeIterator:  
    def __init__(self, root):  
        self.stack = [root]  
  
    def hasNext(self):  
        return len(self.stack) > 0  
  
    def next(self):  
        node = self.stack.pop()  
        if node.children:  
            self.stack.extend(node.children[::-1])  
        return node.value  
  
# 创建一棵树  
root = TreeNode(1)  
child1 = TreeNode(2)  
child2 = TreeNode(3)  
child3 = TreeNode(4)  
root.children = [child1, child2]  
child1.children = [child3]  
  
# 创建迭代器对象  
iterator = TreeIterator(root)  
  
# 遍历树并打印每个节点的值  
while iterator.hasNext():  
    print(iterator.next())

输出结果为:

1
2
4
3

在这个例子中,我们定义了一个TreeNode类来表示树的节点,每个节点有一个值和一个子节点列表。然后我们定义了一个TreeIterator类来实现迭代器模式,它使用一个栈来存储要遍历的节点。在hasNext()方法中,我们检查栈是否为空;在next()方法中,我们从栈中弹出一个节点,并将其子节点(如果有的话)加入栈中。最后,我们使用一个while循环来遍历树并打印每个节点的值。

总结

在迭代器模式中,通过使用迭代器,我们可以更简单地遍历容器中的元素,而无需了解容器的内部实现。此外,迭代器模式还增加了系统的稳定性和可维护性,因为将容器的内部结构和遍历的过程都封装在迭代器中了。

使用迭代器模式可以抽象地处理不同类型的容器,而无需关心具体的容器实现。例如,我们可以编写一个通用的程序来遍历任何支持迭代器的容器,而无需了解容器的具体实现细节。

迭代加深

迭代加深是一种优化深度优先搜索(DFS)的方法。在深度优先搜索中,如果存在一个搜索树,树的深度很大,但答案却在深度很浅的右半部分子树中,DFS会搜索很多无用的节点。

迭代加深通过以下步骤来优化DFS:

  1. 在搜索深度限制为d时,重复搜索第1~d-1层的节点。
  2. 如果在第d-1层搜索失败了,扩大一层后,到了第d层,但我们还是得从第1层开始搜索。
  3. 重复这个过程,直到找到答案。

这种方法在搜索树的规模随着层次的深入增长很快,并且我们能够确保答案在一个较浅的节点时,可以有效地减少搜索的时间和空间复杂度。

好的,以下是一个使用迭代加深优化深度优先搜索的例子

假设我们有一个二叉树,树中的每个节点都有一个值。我们的目标是找到一个节点,使得该节点的值大于其子节点的值之和。

我们可以使用深度优先搜索来找到这个节点。但是,如果我们直接进行深度优先搜索,可能会搜索很多无用的节点,因为答案可能存在于深度很浅的节点中。

使用迭代加深可以优化这个搜索过程。我们可以从根节点开始进行深度为1的搜索。如果搜索失败,我们增加搜索的深度,直到达到一个预定的最大深度。在每次增加深度时,我们都会从最浅的层开始重新搜索,以避免重复搜索已经访问过的节点。

例如,假设我们有一个如下的二叉树:(markdown)

1  
/  \  
2    3  
/  \  
4    5

我们可以使用迭代加深来找到一个节点,使得该节点的值大于其子节点的值之和。首先,我们从根节点1开始进行深度为1的搜索。如果搜索失败,我们增加搜索的深度,直到达到最大深度3。在每次增加深度时,我们都会从最浅的层开始重新搜索。

在第一次搜索时,我们选择左子节点2作为当前节点。然后,我们检查2的右子节点是否存在,如果存在,我们继续搜索右子树;如果不存在,我们回到上一层并选择3作为当前节点。重复这个过程,直到找到答案或者达到最大深度。

在上述例子中,答案是3的父节点2,因为2的值大于其子节点2和3的值之和。使用迭代加深可以有效地减少搜索的时间和空间复杂度,避免在无用的节点上浪费时间和空间。

总结

在迭代加深中,我们首先从根节点开始进行深度为1的搜索。如果搜索失败,我们增加搜索的深度,直到达到一个预定的最大深度。在每次增加深度时,我们都会从最浅的层开始重新搜索,以避免重复搜索已经访问过的节点。

这种方法的主要优点是它可以有效地减少搜索的时间和空间复杂度。在深度很大的搜索树中,如果我们直接进行深度优先搜索,可能会浪费很多时间和空间。而迭代加深通过逐步增加搜索的深度来寻找答案,可以避免在无用的节点上浪费时间和空间。

此外,迭代加深还可以与其他优化技术结合使用,如剪枝、启发式搜索等,进一步提高搜索的效率。

需要注意的是,迭代加深并不适用于所有情况。如果搜索树的大小随着深度的增加而迅速增长,或者答案可能存在于深度很大的节点中,那么直接进行深度优先搜索可能会更有效。因此,在使用迭代加深之前,需要评估其适用性和效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony应用开发环境搭建指南

OpenHarmony的应用开发主要是基于Deveco Studio&#xff08;目前只支持Windows及Mac平台&#xff09;搭配相应的SDK进行&#xff0c;现对开发环境的搭建进行说明。 1:Deveco下载安装 下载对应平台的安装包即可。接下来以Windows平台为例&#xff0c;进行开发环境的搭建。 下载…

我做了一个在手机灵动岛锁屏看实时网速/步数/下班倒计时/跑步距离/照片/待办/倒计时/手机使用次数/帧率...的软件

我做了一个在手机灵动岛&锁屏看实时网速/步数/下班倒计时/跑步距离/照片/待办/倒计时/手机使用次数/帧率…的软件 Island Widgets 的作用&#xff1a; 提醒您 &#xff1a; 准时下班每天运动陪伴家人保持体重放下手机每日待办当前网速手机使用强度实时热搜现在天气… 初…

小米与魅族:竞争中的创新之路

导言 小米与魅族作为中国智能手机领域的两大明星企业&#xff0c;一直在激烈的竞争中谋求创新突破。本文将深入探讨这两家公司在产品、市场和创新方面的竞争与合作&#xff0c;揭示它们在快速发展的移动科技行业中的发展轨迹。 1. 产品创新与竞争 小米的性价比…

Redis查看当前连接情况client list

Redis Client List 命令用于返回所有连接到服务器的客户端信息和统计数据。 redis 127.0.0.1:6379> CLIENT LIST 返回值 addr &#xff1a; 客户端的地址和端口 fd &#xff1a; 套接字所使用的文件描述符 age &#xff1a; 以秒计算的已连接时长 idle &#xff1a; 以秒计算…

mysql 21day yum安装数据库

目录 mysql下载官网下载mysql 源进入mysql 官网 yum安装mysql先安装mysql 源检查源修改安装版本方法一方法二 安装命令 mysql使用启动&开机启动查看密码修改密码登录数据库 mysql下载官网 https://dev.mysql.com/doc/ 链接: 点击进入mysql官网 下载mysql 源 进入mysql 官…

智能优化算法应用:基于吉萨金字塔建造算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于吉萨金字塔建造算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于吉萨金字塔建造算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.吉萨金字塔建造算法4.实验参…

app上架-.您的应用在首次打开或运行中,未见使用权限对应的相关功能或服务时,提前向用户弹窗申请开启【已安装应用列表】权限,不符合华为应用市场审核标准。

上架提示 您的应用在首次打开或运行中&#xff0c;未见使用权限对应的相关功能或服务时&#xff0c;提前向用户弹窗申请开启【已安装应用列表】权限&#xff0c;不符合华为应用市场审核标准。 测试步骤&#xff1a;首次打开APP&#xff0c;在首页页面&#xff0c;非服务所必须…

任务十六:主备备份型防火墙双机热备

目录 目的 器材 拓扑 步骤 一、基本配置 配置各路由器接口的IP地址【省略】 1、配置BGP协议实现Internet路由器之间互联 2、防火墙FW1和FW2接口IP配置与区域划分 3、配置区域间转发策略 4、配置NAPT和默认路由 5、配置VRRP组&#xff0c;并加入Active/standby VGMP管…

Axure的交互与情形,事件,动作

交互样式 交互样式是指当用户与原型进行交互时&#xff0c;元素所呈现出的视觉效果。在Axure中&#xff0c;可以通过设置交互样式来调整元素在交互过程中的外观&#xff0c;例如改变颜色、大小、位置等。 交互事件 交互事件是指在用户与原型进行交互时触发的动作。在Axure中&…

tensorflow入门

一、怎样入手TensorFlow TensorFlow是一个用于机器学习和深度学习的开源框架&#xff0c;它提供了一种灵活的方式来构建和训练神经网络模型。以下是一些TensorFlow框架入门的建议&#xff1a; 学习Python语言&#xff1a;TensorFlow主要使用Python语言进行开发&#xff0c;因此…

Android Studio设置android:background 属性背景颜色

除了默认的颜色之外都要自己添加。 添加颜色的操作步骤&#xff1a; 打开res文件夹&#xff0c;找values&#xff0c;里面有个colors.xml的文件。然后在里面定义一些颜色。 完成

基于PaddleOCR一键搭建文字识别和身份证识别web api接口

前言 通过这篇文章【基于PaddleOCR的DBNet神经网络实现全网最快最准的身份证识别模型】开发的身份证识别模型&#xff0c;还无法进行部署应用&#xff0c;这篇文章就已经开发好的代码如何部署&#xff0c;并如何通过api的接口进行访问进行讲解。 项目部署 以windows系统为例&…

探索人工智能中的语言模型:原理、应用与未来发展

导言 语言模型在人工智能领域中扮演着重要的角色&#xff0c;它不仅是自然语言处理的基础&#xff0c;也是许多智能系统的核心。本文将深入研究语言模型的原理、广泛应用以及未来发展趋势。 1. 语言模型的原理 统计语言模型&#xff1a; 基于概率统计的传统语言模型&…

源码编译 METIS 以及 GKlib 在Linux ubuntu上

1. GKlib 构建 $ git clone --recursive gitgithub.com:Kleenelan/GKlib.git $ cd GKlib/ $ make config ccgcc openmpset $ make $ make install源码构建了 GKlib 的 openmp 版本&#xff0c;以便充分使用多核的算力&#xff1b; make config ccgcc openmpset 的效果图&#…

网神防火墙后台用户敏感信息泄露漏洞复现

简介 网神防火墙是一款由中国知名网络安全公司启明星辰开发的防火墙产品。它提供了全面的网络安全防护功能,旨在保护企业网络免受各种网络威胁和攻击。 该产品存在用户账号信息泄露漏洞,通过构造特定数据包,获取防火墙管理员登录的账号密码。 漏洞复现 FOFA语法: body=&…

Postman使用总结-断言

让 Postman 工具 代替 人工 自动判断 预期结果 和 实际结果 是否一致 断言代码 书写在 Tests 标签页中。 查看断言结果 Test Results 标签页

部署promethues采集kubelet数据报错:server returned HTTP status 403 Forbidden

背景 笔者尝试部署手动部署promethues去采集kubelet的node节点数据信息时报错 笔者的promethus的配置文件和promthues的clusterrole配置如下所示&#xff1a; apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:name: prometheus rules: - apiGroups: […

部署LVS的NAT模式

实验准备 #负载调度器# 192.168.116.40 #内网 12.0.0.100 #外网 先添加双网卡 #web服务器# 192.168.116.20 #web1 192.168.116.30 #web2 #nfs共享服务# 192.168.116.10 #nfs systemctl stop firewalld setenforce 0 1.nfs共享文件 1…

9ACL访问控制列表

为什么要有访问控制&#xff08;Access Control List&#xff09;&#xff1f; 因为我可能在局域网中提供了一些服务&#xff0c;我只希望合法的用户可以访问&#xff0c;其他非授权用户不能访问。 原理比较简单&#xff0c;通过对数据包里的信息做过滤&#xff0c;实现访问控…

Gitee基础知识

目录 1-gitee 1.1gitee介绍 1.2git与gitee的关系 1.3在国内为什么选择Gitee 2-注册与创建远程仓库 2.1注册 2.2创建远程仓库 2.3配置ssh公钥 2.3.1公钥的生成方法&#xff1a; 2.3.2 在gitee中配置公钥 2.3.4验证公钥 3-添加与推送远程仓库master 3.1基本命令…