Python-迭代器-Python自学笔记4
本章重点
- 可迭代对象
- 迭代的概念
- 可迭代对象
- 判断一个对象是否是可迭代对象
- 迭代器
- 什么是迭代器
- 迭代器的作用
- 怎么生成一个迭代器
- 迭代器的用法
- 迭代器的优点
- 迭代器的缺点
可迭代对象
迭代的概念
学习可迭代对象前我们应该了解一下迭代的概念
以下是我在维基百科中找到的关于迭代的定义:
-
迭代是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。
-
用代码解释:
-
实例1----非迭代
-
i = 0 while i < 5: print("Python 是世界上最好的语言") i += 1 ````
-
实例2----迭代
-
i = 0 while i < 5: print(i) i += 1
-
上面这两段代码看着很相似,但是为什么实例1是非迭代而实例2却是迭代呢?其实是因为实例1仅仅是重复打印了5次
Python 是世界上最好的语言"
,它所输出的内容并不依赖上一次的数据,所以不能算迭代。 -
而实例2每次输出的结果都是基于上一次的数据
+=1
所以是迭代。
-
可迭代对象
-
可迭代对象,并不是某种具体的数据类型,它是指存储了元素的一个容器对象。且这个容器对象包拥有
__iter__
或__getitem__
方法。 -
那么如何确定一个对象是否是可迭代对象:
思路:上面提到了,有
__iter__
方法的对象就是可迭代对象,我们只需要查看这个对象的所有方法,再看里面有没有__iter__
方法。我们可以使用python内置方法
dir()
查看一个对象的所有方法。例如:
l = [1,2,3,4,5,6] print(dir(l))
结果:
-
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
内置方法
dir()
会获取对象的所有方法并返回一个列表,且列表内的每一个元素都是以字符串形式表现上方的返回结果里面有
__iter__
和__getitem__
方法,我们可以确定列表就是一个可迭代对象。但这样子一次性返回这么多方法,我们要一个个去看,这显然不够直观,现在我们用我们以前学过的内容,搭配dir()
方法确定该对象是不是可迭代对象。自己先尝试写一下,写完再点开看
print(('__iter__' in dir(l)) or ('__getitem__' in dir(l))) 结果 >>> True
-
迭代器
什么是迭代器
GOF给迭代器的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。
迭代器就是为了实现不同集合进行统一遍历的一种机制。
内部含有 __next__
方法的对象都是迭代器
迭代器的作用
从上面这句定义我们可以看出 迭代器 就是为了容器而生,而迭代器需要做的事就是将容器中的元素一个一个取出来。
怎么创建迭代器对象(两种方法)
创建迭代器之前,我们需要先知道,用于创建迭代器的对象必须是可迭代对象,
如 str
list
dict
set
等,这种可迭代对象都可以用于创建迭代器。
-
使用内置函数创建迭代器对象 (
iter(obj)
)-
li = [1, 2, 3, 4] iter_obj = iter(li) # 迭代器对象
-
-
使用对象方法创建迭代器对象 (
obj.__iter__()
)-
str_ = "Hello Python" iter_obj = str_.__iter__() # 迭代器对象
-
迭代器的用法
迭代器是不能直接查看里面的元素的,需要使用 next(iter_obj)
进行取值,且使用一次next()
取一个元素,且取值次数只能和元素个数一样,否则将报 StopIteration
错误
迭代器里的每个元素只能取值一次,所以不能还原迭代器,也就是说迭代器里面的元素取完了,这个迭代器就不能再次使用了。
实例:
-
# 创建一个列表 li = [1, 2, 3, 4] # 创建这个列表的迭代器对象 li_iter = iter(li) # 取值 # 取值也可以使用 li_iter.__next__() 方法 print(next(li_iter)) print(next(li_iter)) print(next(li_iter)) print(next(li_iter))
-
结果:
1
2
3
4
现在我们利用while
循环来模拟一下 for
循环遍历。
-
li = [1, 2, 3, 4, 5, 6, 7, 8, 9] iter_obj = iter(li) while 1: try: # 异常捕获 print(next(iter_obj)) except StopIteration: # 如果报了StopIteration错误就执行break break
-
结果:
1
2
...
345678 # 让我偷一下懒9
迭代器的优缺点
- 优点:
- 节约内存
- 惰性机制,一次只取一个值。
- 缺点:
- 速度慢
- 不能恢复迭代器,即同一个元素只能取一次。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具