【python基础教程】迭代器与生成器详解
一、迭代器
1、什么是迭代器
说迭代器之前有个相关的名词需要介绍:
可迭代对象:只要定义了__iter__()
方法,我们就说该对象是可迭代对象,并且可迭代对象能提供迭代器。
在Python中,for循环可以用于Python中的任何类型,包括列表、元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器。
迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有__next__
方法的对象会前进到下一结果,而到一系列结果的末尾,则会引发StopIteration。任何这类的对象在Python中都可以用for循环或其他遍历工具迭代,迭代工具内部会在每次迭代时调用next方法,并且捕捉StopIteration异常来确定何时离开。
2、为什么要用迭代器
使用迭代器一个显而易见的好处就是:每次只从对象中读取一条数据,不会造成内存的过大开销。
比如要逐行读取一个文件的内容,利用readlines()方法,我们可以这么写:
for line in open("test.txt").readlines():
print (line)
这样虽然可以工作,但不是最好的方法。因为他实际上是把文件一次加载到内存中,然后逐行打印。当文件很大时,这个方法的内存开销就很大了。
利用file的迭代器,我们可以这样写:
for line in open("test.txt"): #use file iterators
print (line)
这是最简单也是运行速度最快的写法,他并没显式的读取文件,而是利用迭代器每次读取下一行。
3、如何使用迭代器
使用内建的工厂函数iter(iterable)可以获取迭代器对象(对象包含__iter__
方法即可迭代,__iter__
方法返回一个迭代器):
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> lst = range(5)
>>> it = iter(lst)
>>> it
<listiterator object at 0x0000000001E43390>
使用next()方法访问下一个元素
>>> it.next()
0
>>> it.next()
1
>>> it.next()
2
python处理迭代器越界是抛出StopIteration异常
>>> it.next()
3
>>> it.next
<method-wrapper 'next' of listiterator object at 0x01A63110>
>>> it.next()
4
>>> it.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
了解了StopIteration,可以使用迭代器进行遍历了:
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
lst = range(5)
it = iter(lst)
try:
while True:
val = it.next()
print (val)
except StopIteration:
pass
for语法糖:
>>> lst = range(5)
>>> for i in lst:
... print (i)
...
0
1
2
3
4
本文来自博客园,作者:I'm_江河湖海,转载请注明原文链接:https://www.cnblogs.com/jhhh/p/16760717.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧