Python自定义迭代器

Python中创建迭代器的方法 迭代器是Python中一种非常有用的数据结构,它可以用于遍历可迭代对象(iterable)。创建自定义的迭代器可以让我们按照自己的需求定义遍历规则,提供更灵活的迭代方式。下面我将详细介绍如何在Python中创建迭代器,并附上相应的源代码。通过自定义迭代器,我们可以根据需要实现不同的遍历逻辑和规则。希望以上内容能帮助你了解如何在Python中创建迭代器,并应用于实际的编程场景中。每次迭代,我们打印出当前元素的值。自增1,并返回自增前的值作为迭代器的下一个元素。在上面的代码中,我们定义了一个名为。 阅读详情

如何在名为__iter__ 和__next__ 的类方法的帮助下创建一个自定义迭代器。我们还将学习如何在Python的生成器的帮助下创建一个自定义迭代器。

借助于类方法__iter__ 和__next__ 创建一个自定义迭代器

现在当你说到迭代器时,顾名思义,它将被用来进行迭代。

如果你来自C、C++和Java等语言,我们有一个共同的概念:++ 。当我们谈论迭代的时候,还有一个概念是已知的:for 循环。

比方说,我们有一个包含5个元素的列表。使用一个循环,我们可以从第一个元素迭代到最后一个元素。

这样,我们就有了一个带有一些数值的列表,如果我们想用索引号逐一打印它们。

如果我们传递我们的索引0,它将给我们提供第一个元素,2。如果我们使用索引值1,它将为我们提供第二个元素,5。

Numbers=[2,5,10,3,1]
print(Numbers[0])
print(Numbers[1])

输出:

2
5

另一种打印数值的方法是使用循环。我们可以对一个列表进行迭代并打印所有的值。

Numbers=[2,5,10,3,1]
for i in Numbers:
    print(i)

输出:

2
5
10
3
1

现在我们还有一种方法:通过使用迭代器。一般来说,迭代器在for 循环的背后工作。

我们将使用iter() 函数来理解一个迭代器,它将把我们的列表转换成一个迭代器。这个迭代器不会给我们所有的值,它每次只给一个值。

Numbers=[2,5,10,3,1]
ITR=iter(Numbers)
print(ITR)

我们可以看到它正在打印一个迭代器的对象。

<list_iterator object at 0x000001FEDCFF7310>

但是,如果你想要这个值,你可以设置ITR.__next__() ,这是一个内建的方法。它将在特定对象上第一次调用__next__() 方法时给我们第一个值;这与我们使用索引值的方式相同,但好处是我们不必使用索引值。

umbers=[2,5,10,3,1]
ITR=iter(Numbers)
print(ITR.__next__())

输出:

2

当我们在下一个执行行中执行ITR.__next__() ,它将给出下一个值。在这个场景背后,迭代器将有多个值,所以当我们调用__next__() 方法时,它将拾取一个值。

再说,当我们调用__next__() ,它知道i 的最后一个值,这意味着它将保留最后一个值的状态。这就是迭代器的魅力;当我们再次调用该函数时,它将保留旧值。

我们可以使用一个类来创建我们的迭代器。使用该类,我们可以单独打印前10个值。

为了达到这个目的,我们将有一个名为TopValues 的类,在这个类中,我们将指定一个计数器。

为此,我们将使用__init__ 函数,在这里我们将定义我们的计数器变量self.N=1 ;显然,计数器将从1开始初始化。我们需要两个重要方法来创建我们的自定义迭代器。

第一个是iter() 方法,它将给我们迭代器的对象,然后next() 方法将提供下一个值或对象。在__next__ 方法中,我们没有返回self.N ,而是使用了一个叫做VALUE 的变量,我们将把self.N ,在下一行中,我们把self.N 递增为1。

这样,它将在每一个下一次迭代中被递增,然后返回VALUE ,而不是self.N ,因为self.N 在下一次迭代中被递增。

class TopValues:
    def __init__(self):
        self.N=1
    def __iter__(self):
        return self
    def __next__(self):
        VALUE=self.N
        self.N+=1
        return VALUE

我们的迭代器现在已经准备好了,我们可以创建一个TopValues 类的对象。让我们使用一个循环,因为通常当你有一个迭代器时,我们可以使用循环。

T_Val=TopValues()
for i in T_Val:
    print(i)

现在当我们执行这段代码时,我们会得到成千上万的值。

1
2
3
4
5
....
1000

让我们试着理解发生了什么。为了检查迭代器是否工作,我们将使用__next__() 。

print(T_Val.__next__())

这一行将打印第一个迭代值,1 ,但循环出了什么问题?问题在于,这个循环将从起点走到终点;我们假设终点是10,但我们没有提到应该在哪里停止。

当我们使用循环时,它将调用next() 函数,这就是它的工作方式。for 循环内部使用next() 函数;因此,它将反复调用这个next() 函数。

我们必须在__next__ 方法里面应用一个条件。

我们还必须设置else 块;在这个块里面,我们将引发一个异常。否则,在打印了10个值之后,循环将打印None 。

class TopValues:
    def __init__(self):
        self.N=1
    def __iter__(self):
        return self
    def __next__(self):
        if self.N<=10:
            VALUE=self.N
            self.N+=1
            return VALUE
        else:
            raise StopIteration
T_Val=TopValues()
for i in T_Val:
    print(i)

输出:

1
2
3
4
5
6
7
8
9
10

在生成器的帮助下创建一个自定义迭代器

现在让我们试着创建一个生成器函数来做同样的事情。生成器要简单得多,因为它为我们处理了__iter__() 和__next__() 方法。

如果我们试着写一个名为Our_Gen() 的生成器函数,我们将在这个函数中传递参数。

由于我们是在列表上循环,所以我们是一次产生一个项目。而且,当没有更多的项目可以循环时,它会自动处理,并引发一个异常来停止迭代。

现在我们在Our_Gen() 函数上循环,所以它应该一次打印出一个项目。如果我们运行它,我们可以看到我们一次得到一个。

def Our_Gen(n_list):
    for i in n_list:
        yield i
Func=Our_Gen([2,5,10,3,1])
for i in Func:
    print(i)

输出:

2
5
10
3
1

为了确保我们的next() 函数仍然在工作。执行后,我们得到五个元素我们得到一个停止迭代的异常。

#Python小白学习交流群:711312441
def Our_Gen(n_list):
    for i in n_list:
        yield i
Func=Our_Gen([2,5,10,3,1])
print(Func.__next__())
print(Func.__next__())
print(Func.__next__())
print(Func.__next__())
print(Func.__next__())
print(Func.__next__())

输出:

2
5
10
3
1
Traceback (most recent call last):
  File "c:UsersDellDesktopdemodemo.py", line 56, in <module>
    print(Func.__next__())
StopIteration

生成器比类更容易编写。但是根据你的用例,你可能需要知道如何在一个类中做__iter__() 方法和__next__() 方法。

你可以从这里阅读更多关于创建一个自定义迭代器的信息。

桁架 拓扑优化 matlab程序_拓扑优化在结构轻量化及板壳加筋肋最优布置的应用... 1 拓扑优化简介材料的有效利用一直都是人类追求的目标,也是许多研究领域不变的话题,并伴随着结构优化理论和方法的产生而发展。结构优化设计通常分为三个层次:(1)拓扑优化:在一个确定的连续区域内寻求结构内部非实体区域位置和数量的最佳配置,寻求结构中的构件布局及节点联结方式最优化,使结构能在满足应力、位移等约束条件下,将外载荷传递到结构支撑位置,同时使结构的某种性态指标达到最优;(2)形状优化:指在保持... 阅读详情

相关推荐

手把手教你用Python实现最简单的语义通信(Sem Comm)Demo

本文通过Python和PyTorch,手把手教你构建一个基于深度学习的语义通信(Semantic Communication)Demo。该Demo使用自编码器架构,从MNIST图像中提取低维语义特征进行传输与重建,实现了从“传输比特”到“传递含义”的跨越,并探讨了其效率优势与鲁棒性。

weixin_29080843的博客 247

自定义Python的迭代器

使用python快速实现一个网络模型输入的迭代器

weixin_42924890的博客 835

乐鑫WIFI芯片开发流程梳理-工具链、编译和下载

最近开始基于乐鑫ESP32的WIFI模组的软件开发,首先要做整套流程的梳理,乐鑫官网以及安信可上已经有了较为系统的资料,但是在实现过程中也遇到了一些问题,花了几天去解决,所以为了总结,也为了给其他人提供一些借鉴,把流程分享一下,官网上相对比较完善的,就不在赘述。 1. 开发方案选择 目前网上有两套较为成熟的方案: (1)基于乐鑫官网推荐的开发方式,原网页:https://docs.espress...

一名嵌入式软件工程师的自我成长 3927

Python魔法方法之__iter__

Python的魔法方法__iter__

qq_51352578的博客 7883

计算机组成原理实验二 运算器组成实验

事实上,ALU的设计是在全加器的基础上,对全加器功能的扩展来实现符合要求的多种算术/逻辑运算的功能。为了实现多种功能的运算,An、Bn数据是不能直接与全加器相连接的,它们受到功能变量F3—F1的制约,因此,可由An、Bn数据和功能变量F3-F1组合成新的函数Xn 、Yn,然后,再将Xn 、Yn和下一位进位Cn-1通过全加器进行全加运算以实现所需的运算功能。AC寄存器可用来存储ALU的输入以实现两个操作数的运算操作,也可以用来存储来自ALU的结果,以将这些结果反馈给ALU以进行更多的处理。

qq_63574533的博客 1451

Dify + Oracle + MCP:轻松构建 RAG 应用与Oracle MCP Agent

通过一个实践案例,展示如何使用 Oracle 23ai 数据库、Dify、Oracle SQLcl MCP 从零开始构建一个功能完备的 RAG 应用,以及通过 Agent 与 SQLcl MCP Server 实现 Oracle 数据访问。

Rambo zheng的博客 2501

Python 自定义迭代器

现在,当您说迭代器时,顾名思义,它将用于迭代。如果您来自 C、C++ 和 Java 等语言,我们有一个共同的概念:++。当我们谈论迭代时,还知道了一个概念:for 循环。假设我们有一个包含 5 个元素的列表。使用循环,我们可以从第一个元素迭代到最后一个元素。这样,我们就有了一个包含一些值的列表,如果我们想使用索引号一一打印它们。如果我们传递索引 0,它将为我们提供第一个元素 2。如果我们使用索引值 1,它将为我们提供第二个元素 5。2 5打印值的另一种方法是使用循环。我们可以迭代列表并打印所有值。

迹忆客 269

面向企业级应用的 SAP UI5 troubleshooting 全景指南:从日志与调试到性能与可测试性

本指南系统化介绍了SAP UI5应用排错的完整流程和工具链。从基础的浏览器开发者工具使用,到SAP UI5专用调试工具(Technical Information Dialog、Support Assistant、Diagnostics Window),再到性能优化和日志管理,提供了一套工程化的解决方案。重点推荐组合使用UI5 Inspector扩展、Test Recorder测试工具以及性能测量模块,并强调将常见问题整理成团队知识库。通过制度化的排错步骤和工具组合,开发者可以快速定位、复现和修复问题,将调

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 286

Python中的__iter__函数

Python中的__iter__函数

python一生之敌的博客 2137

产品路线图的三种模型(RICE/MoSCoW/Kano),教你如何对需求进行优先级排序

RICE/MoSCoW/Kano三种模型,教你如何对需求进行优先级排序。 也许你会让业务提供一份ROI,记得前不久参加过一场立项会评审,一位很有意思的小产品在会上讲不清楚ROI,评审们要求会后重新梳理,小产品表达不要为难业务方干一些他们不擅长的事了。这个看似笑话的经历,背后隐藏着价值判断已经流于形式。 也许你会要求业务方直接给出需求优先级列表,把任务分为P0到P5,这样的划分除了按需求本质的优先级还同时考虑了开发资源、开发难度等问题。毫不夸张地说,我曾经拿到一张全是P0级别的需求清单,如果一切任务都是高

wenyusuran的专栏 5545

QT+Opencv实现视频流播放

1.流程 首先通过opencv打开视频流,获取到数据帧,然后将数据帧转换为QT可识别的图像,显示到QT界面上。 2.opencv解码线程源码 //DecodeOpencv.h #pragma once #include <QThread> #include <QObject> #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/img..

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 6459

Python迭代器及自定义迭代器

Python迭代器及自定义迭代器 一、可迭代对象 在Python中,对list、tuple、str等类型的数据可以使用for...in...的循环语法,从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。 在Python的基本数据类型中,列表、元组、字符串、字典都是可迭代的,而整数、浮点数、布尔数都是不可迭代的。 list_a = [1, 2, 3] for a in lis...

weixin_43790276的博客 8538

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

python自定义迭代器_python--自定义迭代器的学习

#如何得到自定义的迭代器:#在函数内一旦存在yield关键字,调用函数并不会执行函数代码体代码#会返回一个生成器对象,生成器即自定义的迭代器# def func():# print("第一次")# yield 1# print("第二次")# yield 2# print("第三次")# yield 3# g=func()# print(g)## #...

weixin_33260887的博客 485

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【Python】在Python中自定义迭代器Iterator

Python中迭代器本质上是每次调用.next()都返回一个元素或抛出StopIteration的容器对象。 在Python中其实没有“迭代器”这个类,具有以下2个特性的类都可以被称为“迭代器”类: 1、有next方法,返回容器的下一个元素或抛出StopIteration异常; 2、有__iter__方法,返回迭代器本身; 自定义迭代器的例子(来自《Expert Python Progra

GhostFromHeaven的专栏 6502

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

自定义一个python迭代器

迭代器(iterator)是python语言中一个重要的概念,我们可以在for循环中使用迭代器来完成遍历工作。百度词条对迭代器的定义如下: 迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。 在python中,我们可以编写class来自定义迭代器,关键在于这个class需要包含两个关键的魔法函数和一个遍历到尽头的异常如下: __iter__魔法方法 __next__魔法方法 __Sto

weixin_41855010的博客 1094

python自定义迭代器_python3中自定义类的迭代器

我正在尝试将一个自定义类从python2移植到python3。我找不到正确的语法来为类移植迭代器。下面是一个真实类的MVCE,以及我目前解决这个问题的尝试:使用Python 2代码:class Temp:def __init__(self):self.d = dict()def __iter__(self):return self.d.iteritems()temp = Temp()for thi...

weixin_34279705的博客 451

python-代码自定义迭代器

自定义可迭代对象 class Studentlist(object): def init(self): self.list_item = [] def append_item(self,name): self.list_item.append(name) def func(self): #获取Studentlist对象的迭代器 stu_iter = iter(stu) print(next(stu...

weixin_44425707的博客 338

python3 迭代器_Python3 自定义迭代器

1、迭代器基于下面两个个方法:(1)__next__ 返回容器的下一个项目(2)__iter__ 返回迭代器本身2、当序列遍历完时,将抛出StopIteration异常,所以通过捕获这个异常来停止循环下面是自定义迭代器的示例代码:#encoding:UTF-8class MyIterator(object):def __init__(self,step):self.step=stepdef __n...

weixin_39827905的博客 243

python进阶--迭代器,生成器,自定义迭代器让你的程序效率更高

迭代是 Python 最强大的功能之一。初看起来,你可能会简单的认为迭代只不过是处理序列中元素的一种方法。然而,绝非仅仅就是如此,还有很多你可能不知道的,比如创建你自己的迭代器对象,在 itertools 模块中使用有用的迭代模式,构造生成器函数等等。 手动遍历迭代器: >>> it = iter(range(2)) >>> next(it) 0 >>> next(it) 1 >>> next(it) Traceback (most r

月半的博客 651

Python自定义迭代器对象

迭代是访问集合元素的一种方式,迭代器是可以迭代的对象,它可以记住遍历的位置。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 文件 MyClass.py : #! encoding=utf-8 class MyClass: def __init__(self): self.a = [[i] for i in range(20)] se...

Learning 1911

Python 自定义迭代器 Iterator

迭代器是 Python 中一种用于逐个产出元素的对象,支持“惰性”访问数据。迭代器协议要求对象实现__iter__()和__next__()两个方法。所有迭代器都是可迭代对象,但并非所有可迭代对象都是迭代器。可迭代对象:实现了__iter__(),可用于for循环,但不一定能用next()。迭代器对象:实现了__iter__()和__next__(),可用next()逐步获取元素,最节省内存。迭代器适合处理大数据、流式数据、无限序列等场景。

qq_37805832的博客 458

Python自定义迭代器:从入门到精通

本文详细介绍了Python中自定义迭代器的实现方法。首先阐述了迭代器协议的核心要求:必须实现__iter__()返回自身和__next__()方法。然后通过生成指定范围偶数的示例,展示了基本实现方式。文章深入解析了迭代器的工作原理,包括一次性特性及多次遍历的实现方法。

2301_80168404的博客 395

Python基础教程:自定义迭代器

本文介绍如何自定义迭代器,涉及到类的运算符重载,包括__getitem__的索引迭代,以及__iter__、__next__和__contains__,如果不了解这些知识可跳过本文。 索引迭代方式 索引取值和分片取值 元组、列表、字典、集合、字符串都支持索引取值操作和分片操作。 >>> L = [11,21,31,41] >>> L[0] 11 >>> L[0:2] [11, 21] 分片操作实际上将一个slice对象当作索引位传递给序列,然后以索引取

Python热爱者的博客 1252

自定义python迭代器

当使用迭代器的数据时,每次从数据流中取一个数据,直到被取完,而且不会重复. 迭代器协议方法主要是__iter__和__next__,在无下一个元素的时候会引发StopIteration异常停止迭代 那么现在来自定义一个迭代器 class MyIterator: #自定义迭代器的类 def __init__(self,x=2,...

YouYuDeYan的博客 529

【无为则无心&Python基础】— 74、Python中自定义迭代器

文章目录1、迭代器对象的创建2、实际应用案例3、总结:(1)整理:(2)迭代协议(3)为什么任何python序列都可迭代? 1、迭代器对象的创建 迭代器是一种可以被遍历的对象,并且能够作用于next()函数,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往后遍历,不能回溯。不像列表,你随时可以取后面的数据,也可以返回头取前面的数据,迭代器通常要实现两个基本方法next...

繁华似锦Fighting 903

Python3 自定义迭代器

1、迭代器基于下面两个个方法: (1)__next__ 返回容器的下一个项目 (2)__iter__ 返回迭代器本身 2、当序列遍历完时,将抛出StopIteration异常,所以通过捕获这个异常来停止循环 下面是自定义迭代器的示例代码: #encoding:UTF-8 class MyIterator(object): def __init__(self,step): ...

Mr_Tank_ 343
上一篇: Python中跨越多个文件使用全局变量
下一篇: Python教程:sys.stdout方法
Python热爱者
博客等级 码龄7年 3056粉丝 1330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值