Python中的迭代器与可迭代

理解python中的迭代器对象、可迭代对象、生成器对象 最近又开始学习Python了,但是在遇到迭代器对象、可迭代对象、生成器对象的时候,感到十分懵逼,所以上B站查了下,本文主要参考对象:15分钟彻底搞懂迭代器、可迭代对象、生成器【python迭代器】,有空的话可以看看,up主讲得挺清楚的。 首先来看迭代器对象的定义: 类中定义了__iter__和__next__方法 __iter__方法返回self,也就是自身 __next__方法返回下一个数据,如果没有数据了,则要返回StopIteration的异常(一定要定义什么时候结束迭代,否则就会像没有break的 阅读详情

很多人在听到迭代器与可迭代这两个名词时往往会搞不清楚,甚至认为他们是一样的,但是实际上他们是不同的概念。

我们先来直观的区分这两者有什么不同。

可迭代 (iterable):如果一个对象具备有__iter__() 或者 __getitem__()其中任何一个魔术方法的话,这个对象就可以称为是可迭代的。其中,__iter__()的作用是可以让for循环遍历,而__getitem__()方法可以让实例对象通过[index]索引的方式去访问实例中的元素。所以,列表List、元组Tuple、字典Dictionary、字符串String等数据类型都是可迭代的。

迭代器 (iterator): 如果一个对象同时有__iter__()和__next__()魔术方法的话,这个对象就可以称为是迭代器。__iter__()的作用前面我们也提到过,是可以让for循环遍历。而__next__()方法是让对象可以通过 **next(实例对象) **的方式访问下一个元素。列表List、元组Tuple、字典Dictionary、字符串String等数据类型虽然是可迭代的,但都不是迭代器,因为他们都没有next( )方法。

  • 如何判断可迭代(iterable) & 迭代器(iterator)

我们可以借助Python中的**isinstance(object, classinfo)**函数来判断一个对象是否是一个已知类型。如下例子中,通过isinstance( )函数分别判断列表、元组、字典、字符串是不是可迭代或迭代器。

from collections import Iterable
from collections import Iterator

print(f"List is 'Iterable': {isinstance([], Iterable)}")
print(f"Tuple is 'Iterable': {isinstance((), Iterable)}")
print(f"Dict is 'Iterable': {isinstance({}, Iterable)}")
print(f"String is 'Iterable': {isinstance('', Iterable)}")
      
print("="*25)

print(f"List is 'Iterator': {isinstance([], Iterator)}")
print(f"Tuple is 'Iterator': {isinstance((), Iterator)}")
print(f"Dict is 'Iterator': {isinstance({}, Iterator)}")
print(f"String is 'Iterator': {isinstance('', Iterator)}")

# 输出如下:
# List is 'Iterable': True
# Tuple is 'Iterable': True
# Dict is 'Iterable': True
# String is 'Iterable': True
# =========================
# List is 'Iterator': False
# Tuple is 'Iterator': False
# Dict is 'Iterator': False
# String is 'Iterator': False

通过对定义的分析和比较我们得知:迭代器都是可迭代的(因为迭代器都包含__iter__()函数),但可迭代的不一定是迭代器(因为未必每个可迭代就包含__next__()方法)。

  • 创建一个迭代器

得益于Python的鸭子类型特性,只要我们实现类似具备某一特征的方法,就可以认为它就是什么。所以我们定义了一个类并在类中实现__iter__()和__next__()方法,那么这个类就可以当做是一个迭代器了。

from collections import Iterator

class Data:
    def __init__(self, x):
        self.x = x
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.x >= 10:
            raise StopIteration
        else:
            self.x += 1
            return self.x
        
data = Data(0)

print(f"data is 'Iterator': {isinstance(data, Iterator)}")

# 输出如下:
# data is 'Iterator': True

如上例子中我们可以看到,最后我们用isinstance()函数判断得到结果为True,证明我们定义的实例对象是一个真正的迭代器了。因为是迭代器,我们就可以用for循环来验证试试。

from collections import Iterator

class Data:
    def __init__(self, x):
        self.x = x
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.x >= 10:
            raise StopIteration
        else:
            self.x += 1
            return self.x
        
data = Data(0)

for d in data:
    print(d)

# 输出如下:
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
 

上述例子中,我们定义的类对象内部,把x的值显示在大于等于10以内,否则就会抛出StopIteration异常错误(当然实际使用时并不会出错,只是中断继续执行。)我们先创建了一个初始值为0的实例对象,最后顺利的用for循环遍历了从1到10的数字,因为内部对大于等于10的限制,所以输出到10的时候就停止了。特别要注意的是,如果你再次单独去执行for循环的话不会有任何输出,因为迭代器默认只运行一次。

除了自己定义__iter__()和__next__()魔术方法的外,我们还可以使用Python内置的**iter()**函数来返回一个迭代器,像下面这样。

list_a = [1,2,3,4,5,6]
my_iterator = iter(list_a)

print(f"my_iterator is 'Iterator': {isinstance(my_iterator, Iterator)}")

# 输出如下:
# my_iterator is 'Iterator': True

我们知道,迭代器必须具备两个基本方法__iter__()和__next__(),而__next__()方法是让对象可以通过 **next(实例对象) **的方式访问下一个元素。所以让我们验证下用next()的方式去访问这个我们转换过的迭代器是否能正常运行。

next(my_iterator)

# 输出如下:
# 1
# 2
# 3
# 4
# 5
# 6

通过**next(实例对象) **的方式可以访问出每个元素。但是这里要特别说明的一点是,next()函数只能每次执行一次才输出一次结果,如上从1输出到6,是我们手动执行了6次分别执行出来的,如果在输出6后再次执行的话,它就会报一个StopIteration异常错误。

最后,我们还可以使用Python内置的dir()函数来看看传入参数的属性,方法等信息,比如我们用它来看看之前从list转换成的my_iterator迭代器。

dir(my_iterator)

# 输出如下:
# ['__class__',
#  '__delattr__',
#  '__dir__',
#  '__doc__',
#  '__eq__',
#  '__format__',
#  '__ge__',
#  '__getattribute__',
#  '__gt__',
#  '__hash__',
#  '__init__',
#  '__init_subclass__',
#  '__iter__',
#  '__le__',
#  '__length_hint__',
#  '__lt__',
#  '__ne__',
#  '__new__',
#  '__next__',
#  '__reduce__',
#  '__reduce_ex__',
#  '__repr__',
#  '__setattr__',
#  '__setstate__',
#  '__sizeof__',
#  '__str__',
#  '__subclasshook__']

可以发现,也是意料之中的,my_iterator迭代器包含了两个基本方法__iter__()和__next__()方法。

【Python】深度剖析Python中的可迭代对象与迭代器——掌握高级迭代器实现与应用 在Python编程中,可迭代对象与迭代器是核心概念,广泛应用于数据处理、流式数据传输和惰性求值等场景。理解它们的定义、特性以及如何自定义实现,能帮助开发者更好地编写高效代码。本文将系统性地介绍Python中迭代器与可迭代对象的工作原理,深入探讨 `__iter__()` 和 `__next__()` 方法的实现方式,并通过大量代码示例展示如何创建自定义的可迭代类,应用于惰性生成数据流、支持双向迭代和自定义迭代行为等高级应用。本文的每个示例代码都附有详细中文注释,帮助读者深刻理解这一特性在Python编程中的 阅读详情

相关推荐

揭秘 Python 中的可迭代对象和迭代器

Python 迭代协议中的两个基本概念是可迭代对象和迭代器。在本文中,我们将探讨可迭代对象和迭代器之间的主要区别,以及它们如何帮助我们在 Python 中高效地遍历数据。Iterator除了__iter__()像Iterable一样有方法之外,还有它的特色__next__()方法。迭代器是实现迭代协议的对象,可以对可迭代对象进行迭代。也许更基本,并且为了解释的目的,我们可以将可迭代对象视为具有__iter__()方法的对象。()迭代器的方法只是返回,因为self它已经是一个迭代器。但我们的意思是什么?

我的博客,不一样的自我表达 198

【python知识点】你知道可迭代对象吗?什么是迭代器?

Iterable对象,就是可迭代对象,即可以用for...in...进行遍历的对象,就叫可迭代对象。 比如列表,元组,字符串,字典等都属于可迭代对象。

翼同学 8109

Python中的可迭代Iterable和迭代器Iterator

目录 Iterable可迭代对象 如何判断对象是否是可迭代对象Iterable Iterator迭代器 如何判断对象是否迭代器Iterator 将Iterable转换成Iterator Iterable可迭代对象 如果给定一个 list列表 或 tuple元组 ,我们可以通过 for 循环来遍历这个 list 或 tuple ,这种遍历我们称为迭代(Iteration),可以直接作用...

谢公子的博客 2053

python 可迭代的数据类型有哪些 以及和c/C++里面的那个数据类型相相似

需要注意的是,尽管这些Python数据类型与C/C++中的某些类型在功能上有所相似,但它们在语法、使用方式和内存管理上有着显著的区别。Python的数据类型通常更为高级和抽象,提供了更多的功能和便利性。在Python中,可迭代的数据类型是指那些可以逐一返回其成员项的数据结构。

derekfan668的博客 743

Python中的可迭代对象:迭代器和可迭代对象的使用

总结起来,可迭代对象是Python中一种常见的数据类型,它允许我们使用循环结构遍历其中的元素。无论是使用内置的可迭代对象,还是创建自定义的可迭代对象,我们都可以利用迭代器的概念来实现迭代操作。此外,我们还可以创建自定义的可迭代对象,以便根据特定需求进行迭代操作。在Python中,可迭代对象是指可以被迭代的对象。可迭代对象允许我们使用循环结构来访问其中的元素,从而方便地对数据进行处理和操作。除了自定义可迭代对象,Python还提供了一些内置的可迭代对象。Python中的可迭代对象:迭代器和可迭代对象的使用。

DevAstro的博客 189

私募pp网-私募排行js逆向

在数据采集的学习过程当中,发现了一个有意思的网站,所以记录一下,仅供学习交流,用于其他用途与作者无关。目标:私募基金当中的列表页数据。

zzp28218的博客 1895

什么是“可迭代”

理解“可迭代”和“迭代器”的概念是掌握 Python 编程的重要一步,它可以帮助你更高效地处理数据和实现复杂的逻辑。:可迭代对象是 Python 中许多功能的基础,迭代器是可迭代对象的一个特殊版本,它实现了。等,它们都接受可迭代对象作为参数。语句定义的生成器函数返回的对象。方法的对象,或者是一个实现了。来判断一个对象是否是可迭代的。方法来创建自定义的可迭代对象。用于逐个访问可迭代对象中的元素。:打开的文件对象也是可迭代的。:基于可迭代对象生成新的列表。:可以直接遍历可迭代对象。:支持迭代操作的对象,

li758568825的专栏 1215

记录LeNet的硬件加速器设计(一)

LeNet的硬件加速器设计实现。

2301_81029398的博客 3543

我们经常说的可迭代,到底是什么?

是一个概念,用来描述某个对象是否可以被遍历(通常通过for...of循环)。在 JavaScript 中,可迭代对象是那些实现了的对象。

致未来的你。的博客 959

知识检索中的四大评估指标:准确率、精确率、召回率与F1分数详解

摘要:NLP算法面试中,评估知识检索系统的核心指标包括准确率、精确率、召回率和F1分数。准确率衡量整体预测正确性,但在样本不均衡时可能失真;精确率关注预测正类中的真实比例(查准能力),召回率衡量真实正类被预测的比例(查全能力)。F1分数是两者的调和平均,提供综合评估。这些指标通过混淆矩阵计算,并存在制约关系:提高召回率往往降低精确率,反之亦然。应用场景包括文档检索(评估结果质量和覆盖度)和文本分类(如垃圾邮件过滤)。面试需掌握指标区别、适用场景及平衡方法(如调整阈值)。F1分数在样本不平衡时比准确率更具参考

Ven%的博客 1762

SigFit实战:从FEA到光学仿真的热力耦合分析全流程解析

在光机系统与芯片封装等精密工程领域,热与力的耦合效应是影响产品性能与可靠性的核心物理问题。有限元分析(FEA)是预测结构在热、力载荷下变形与应力的基础工具,但其结果通常无法直接用于评估光学性能。这需要一座桥梁,将物理场数据转化为光学设计语言。其核心原理在于数据映射与面形表征技术,例如通过泽尼克多项式拟合,将离散的节点位移分解为离焦、像散等标准光学像差。这项技术的工程价值在于,它实现了多物理场仿真的闭环,使工程师能在设计阶段精准预测热变形或应力对波前误差、调制传递函数等关键光学指标的影响。其典型应用场景包括高

weixin_28630185的博客 334

可迭代的意思

把可迭代的东西中,每项内容拿出来,挨个复制给变量,每次赋值都要执行一次循环体

wanggaoxingH的博客 2401

用友U8自定义按钮开发:从基础配置到实战业务集成

本文详细介绍了用友U8自定义按钮开发的完整流程,从基础配置到实战业务集成。通过实际案例演示如何在U8系统中添加和替换功能按钮,包括数据库配置、SQL脚本编写和VB组件开发等关键技术点,帮助企业用户实现业务场景的深度定制。

weixin_29698641的博客 254

python中的迭代器,可迭代对象(详细剖析)

1. 什么是迭代器?什么是可迭代对象? 2. 迭代器实现的原理 3. 可迭代对象如何被迭代? 4. 迭代器与可迭代器的s区别

qq_44690947的博客 8675

单片机欠压保护、欠压复位的用法及作用

一. 前言 使用编程环境 :KEIL mdk4 单片机 : NRF24LE1   二. 分析 查询各开发芯片的数据手册,一般在电源管理或者复位设置章节中。以下NRF24LE1为例: Power supply supervisor(电源监控): 电源主管在开机时对系统进行初始化,对即将发生的情况提供预警当电源电压过低而不能安全运行时,系统处于复位状态。 电源管理框图如下:   ...

城南花已开的博客 8401

使用 Visual Studio Code 连接 ABAP On-Premise 系统做开发的详细配置步骤

本文详细介绍了如何在Visual Studio Code中通过ABAP Development Tools扩展连接ABAP On-Premise系统。关键步骤包括:通过Ctrl+Shift+P打开命令行面板选择「ABAP: New Destination...」创建RFC连接(仅支持SSO单点登录),选择本地SAPGUI中已有的系统,输入Client ID、语言和用户名(无需密码),最后将目标系统添加到工作区即可开始开发。文章强调了企业安全考虑下仅支持SSO的设计理念,并展示了连接配置的JSON格式示例。整

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

Python中的可迭代性与迭代器

在Python中,可迭代性和迭代器是非常重要的概念,它们为我们提供了一种优雅且高效的方式来处理序列和集合数据。本文将深入探讨这些概念,包括可迭代协议以及与异步编程相关的可迭代性和迭代器。

公众号:该用户快成仙了 867

[特殊字符] 从零构建携程/飞猪机票价格爬虫:Python异步抓取与反爬对抗实战

在出行决策、竞品分析、价格预测模型训练等场景中,稳定获取携程(Ctrip)和飞猪(Fliggy)的实时机票价格波动数据是刚需。然而,这两大平台均部署了业界顶尖的反爬体系——包括但不限于:动态请求签名(SignToken设备指纹采集(UACanvasWebGL接口参数加密(X-Sign_abtestcookie混淆)频率限制与 IP 封禁(滑动窗口 + 行为检测)目录前言:为什么需要自建机票价格爬虫?一、技术选型与项目架构1.1 核心技术栈1.2 系统架构图(文字描述)1.3 法律与道德声明。

2201_76125261的博客 337

python中的可迭代对象以及迭代器__iter__()

迭代器协议是一种 Python 协议,它定义了对象应该如何支持迭代。方法检查索引是否小于数据的长度,如果是,返回当前索引位置的元素并将索引递增;在 Python 中,可迭代对象是指能够通过迭代器进行遍历的对象。方法的对象,通常是迭代器本身。这些都是 Python 中常见的可迭代对象,可以通过。列表是有序的,可以通过索引访问元素。集合是无序的,不重复的元素集合。字符串是不可变的字符序列,可以通过。方法,该方法返回一个迭代器对象。循环遍历对象时,它会调用对象的。字典是键值对的集合,可以通过。

weixin_50531046的博客 967

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Python中的迭代器与可迭代对象

iterable

weixin_42281402的博客 401

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Python中的可迭代对象、迭代器和生成器的异同点

最近在学Python里异步IO中的协程,协程最初是由生成器变形的yield而来,感觉学完理解有些困难,故此再来回顾一下之前学习的生成器。在Python学习之初比较容易混淆可迭代对象、迭代器和生成器。因此,做以总结以辨析其中关键的区别。以下仅为习后个人理解,如有偏差,还请指出! Talk is cheap,show me the picture! 解释之前,我们先来看一张概览图,下面是一张关于容...

SL_World的博客 6520

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

python中的迭代器和可迭代对象以及闭包

1.可迭代对象 概念:可以直接作用于for循环的对象实体被称为可迭代对象:Iterable 分类:可以直接作用于for循环的数据类型: a.集合数据类型:包含list,tuple,dict,set,string b.generator:如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空...

owlcity123的博客 228

python中的迭代器、可迭代对象、生成器和yield

print("__iter__被执行了...")print("__next__被执行了...")# raise StopIteration用于提前终止一个迭代器中的循环print(isinstance(obj_list,Iterable)) # 输出:Trueprint(isinstance(obj_list,Iterator)) # 输出:Trueprint(i)输出:TrueTrue__iter__被执行了...__next__被执行了...2__next__被执行了...

m0_46610658的博客 970

python可迭代类型和迭代器_这样理解python中的迭代器和可迭代的是否正确?

Python中有一类工具叫做迭代工具,他们能从左至右扫描对象。这包括了for循环、列表解析、in成员关系测试以及map内置函数等。而可迭代对象,顾名思义就是可以用在上述迭代工具环境中,通过一次次迭代不断产生结果的对象。可迭代对象分为两大类,一种是实际保存的序列,即列表、元组,字符串;另一种就是我们上一节总提到的“不一次性产生所有结果列表,而是可以在for循环中按需一次产生一个结果的对象”。如:ra...

weixin_35899324的博客 209

深入迭代器设计模式:Python中的可迭代对象与迭代器分离原则

✅ 可迭代对象:数据容器,需实现iter返回新迭代器。✅ 迭代器:状态机,需实现next和iter。❌ 反模式:对象同时实现iter和next(破坏遍历独立性)。🐍 Python哲学:通过生成器将迭代模式推向更高抽象层级。理解这一分离设计,是掌握Python迭代器协议和生成器机制的基础!

钢铁男儿 892

python 可迭代对象和迭代器区别_搞懂python中的可迭代对象和迭代器对象(即迭代器)...

可迭代的对象和迭代器解惑:可迭代的对象:常见的能够被for循环迭代的一些数据类型都是可迭代的对象,如列表,元组,字典,集合,字符串,生成器,range函数生成的数列等,从普遍的意义上来讲,这些对象都有一个内置的iter方法,且该方法能够返回一个迭代器对象,当用iter(可迭代对象)调用这个对象时,会返回一个迭代器对象(属于Iterator类)pythonfor语句的原理就是先用iter函数获取可迭...

weixin_39715513的博客 211
上一篇: python的短逻辑
下一篇: 用yield关键字创建生成器
itanders
博客等级 码龄19年 178粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值