Python基础(迭代器)
一、迭代器
概述:
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:
延迟计算或惰性求值 (Lazy evaluation):
迭代器不要求你事先准备好整个迭代过程中所有的元素。仅仅是在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。
这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。
可迭代对象:
迭代器提供了一个统一的访问集合的接口。只要是实现了__iter__()或__getitem__()方法的对象,就可以使用迭代器进行访问。
序列:字符串、列表、元组
非序列:字典、文件
自定义类:用户自定义的类实现了__iter__()或__getitem__()方法的对象
生成迭代器的两种方式:
1 # 使用对象内置的__iter__()方法生成迭代器 2 L1 = [1,2,3,4,5,6] 3 I1 = L1.__iter__() 4 print(I1) 5 # >>>:<listiterator object at 0x7fe4fd0ef550> 6 print(I1.__next__()) 7 # >>>:1 8 print(I1.__next__()) 9 # >>>: 2 10 print(I1.__next__()) 11 #>>> : 3
1 # 使用内置工厂函数生成迭代器 2 L1 = [1,2,3,4,5,6] 3 I2 = iter(L1) 4 print(I2) 5 #>>> : <listiterator object at 0x7fe4fd0ef610> 6 print(I2.__next__()) 7 # >>> :1 8 print(I2.__next__()) 9 # >>> :2 10 print(I2.__next__()) 11 # >>> :3 12 print("内建next()方法:",next(I2))
StopIteration
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 或next()方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
Python强大的for循环:
for循环实现的原理就是调用可循环对象(列表,元组,字符串等)的__iter__()或iter()方法,使其变成符合迭代器协议的迭代器对象,然后调用迭代器对象的__next__()或next()方法依次不可逆的获取 迭代器对象中的元素。
下面让我们通过三段代码来学习for循环的本质:
1 #for循环实现机制 2 li=["alex","kelvin","elvin"] 3 4 for i in li: 5 print(i) 6 """ 7 输出结果: 8 alex 9 kelvin 10 elvin 11 """ 12 13 14 #上面的for循环实现等同于: 15 Li=li.__iter__() 16 count=len(li) 17 while count: 18 print(Li.__next__()) 19 count-=1 20 """ 21 输出结果: 22 alex 23 kelvin 24 elvin 25 """ 26 27 #上面的for循环实现原理如下: 28 Li=li.__iter__() 29 while True: 30 try: 31 print(Li.__next__()) 32 except StopIteration: 33 break 34 """ 35 输出结果: 36 alex 37 kelvin 38 elvin 39 """
说明:
for循环可用于任何可迭代对象
for循环开始时,会通过迭代协议传输给__iter__()内置函数,从而能够从迭代对象中获得一个迭代器,返回的对象含有需要的__next__()方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~