Python中可迭代对象,迭代器和生成器的异同点
参考:https://blog.csdn.net/SL_World/article/details/86507872
解释之前,我们先来看一张概览图,下面是一张关于容器(container)、可迭代对象(Iterable)、迭代器(iterator)、生成器(generator)、生成器函数和生成器表达式的概览图。
翻译一下
它们的从属关系如下
一,容器(container)
【概述】:容器就是一个用来存储多个元素的数据结构
【特点】:
①容器中的元素可通过迭代获取。
②所有容器中的元素被存储在内存中。
【举例】:以下都是常见容器对象,他们都可以通过迭代获取,所以它们也是可迭代对象(Iterable),我们暂且理解可迭代对象就是可以被迭代获取的对象。(注:并非所有容器对象都是可迭代对象)
首先引入如下模块
1 2 3 4 | # 可迭代对象 from collections import Iterable # 迭代器 from collections import Iterator |
1,列表(list)
1 2 3 4 5 6 7 8 9 10 11 | # 列表list是可迭代对象,但是不是迭代器 title = [ 'Python' , 'Java' , 'C++' ] for i in title: print (i) # Python # Java # C++ print ( isinstance (title,Iterable)) # True print ( isinstance (title,Iterator)) # False |
2,元组(tuple)
1 2 3 4 5 6 7 8 9 10 11 | # 元组teple是可迭代对象,但是不是迭代器 title = ( 'Python' , 'Java' , 'C++' ) for i in title: print (i) # Python # Java # C++ print ( isinstance (title,Iterable)) # True print ( isinstance (title,Iterator)) # False |
3,字典(dict)
注:此处打印的字典中的key而不是value
1 2 3 4 5 6 7 8 9 10 11 | # 字典是可迭代对象,但是不是迭代器 title = { 'Python' : 3 , 'Java' : 1.9 , 'C++' : 2 } for key in title: print (key) # Python # Java # C++ print ( isinstance (title,Iterable)) # True print ( isinstance (title,Iterator)) # False |
4,集合(set)
1 2 3 4 5 6 7 8 9 10 11 | # 集合set是可迭代对象,但是不是迭代器 title = { 'Python' , 'Java' , 'C++' } for i in title: print (i) # Python # Java # C++ print ( isinstance (title,Iterable)) # True print ( isinstance (title,Iterator)) # False |
5,字符串(str)
1 2 3 4 5 6 7 8 9 10 11 | # 字符串str是可迭代对象,但是不是迭代器 title = 'abc' for i in title: print (i) # a # b # c print ( isinstance (title,Iterable)) # True print ( isinstance (title,Iterator)) # False |
二,可迭代对象(Iterable)
【简述】:可迭代对象就是可以被迭代获取的对象。
【特点】: Iterable定义了绝返回迭代器的__iter__()方法
【举例】:
1 2 3 4 5 6 7 8 9 10 11 | # list是可迭代对象 title = [ 'Python' , 'Java' , 'C++' ] print ( isinstance (title,Iterable)) # 可迭代对象的iter方法返回一个迭代器 a = iter (title) print ( next (a)) print ( next (a)) print ( next (a)) # next完毕再次next因为没有值所以抛出StopIteration异常 # print(next(a)) # StopIteration |
如果我们写出以下代码
1 2 | for elem in [ 1 , 2 , 3 ]: print (elem) |
则实际内部运算过程是这样,列表x是一个可迭代对象,在for循环中进过iter()方法变为迭代器,然后遍历x实际就是内部调用elem = next(x)
三,迭代器(Iterator)
【简述】:迭代器是一个带状态的对象。之所以说是带状态的对象是因为迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,以方便下次迭代的时候获取正确的元素。迭代器可以通过next()方法来迭代获取下一个值。
【特点】:
①Iterator实现了__iter__()和__next__()方法
②迭代器不会一次性把所有元素加载到内存,而是需要的时候才返回结果(不同于容器)
【举例】:和上面例子一样,下面的a就是一个迭代器,和可迭代对象title不同,a可以通过next(a)来逐个获取其中的每个元素
1 2 3 4 5 6 7 8 9 10 11 | # list是可迭代对象 title = [ 'Python' , 'Java' , 'C++' ] print ( isinstance (title,Iterable)) # 可迭代对象的iter方法返回一个迭代器 a = iter (title) print ( next (a)) print ( next (a)) print ( next (a)) # next完毕再次next因为没有值所以抛出StopIteration异常 # print(next(a)) # StopIteration |
如果使用next(title)则会报TypeError错误,显示列表对象不是一个迭代器
1 2 3 | # 不是迭代器使用next方法会报TypeError错误 # next(title) # TypeError: 'list' object is not an iterator |
迭代器每次调用next()方法的时候做两件事:
1,为下一次调用next()方法修改状态
2,生成当前调用的返回结果
【推荐】国内首个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满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2020-09-30 ansible笔记(13):tags的用法
2020-09-30 ansible笔记(12):handlers的用法
2020-09-30 ansible笔记(11):初识ansible playbook(二)
2020-09-30 Linux下查看占用CPU与内存最高的进程
2019-09-30 ELK之es常用查询语句