迭代器
一、可迭代对象
-
可迭代对象
- 字面意思:对象?python中一切皆对象。一个实在存在的值,对象
- 可迭代?:更新迭代,重复的,循环的一个国产,每一次都不太一样!(比如你爷爷生你爸爸,你爸爸生你,你生你儿子)
- 可迭代对象:可以循环更新的,一个实实在在的值!!!
- 专业角度:内部含有‘——iter——’方法的对象,就叫可迭代对象
- 学过的可迭代对象:str、list、dict、tuple、set、range、文件句柄
-
优点:
- 存储的数据能直接显示,比较直观
- 拥有的方法比较多,操作方便
-
缺点:
- 占内存大
- 不能直接通过for循环,不能直接取值(索引、key)
#实际上是解释器做了封装,要不然不能直接循环遍历
li = [1,2,3,4]
for i in li:
print(i)
- 代码判断是否是可迭代对象
# dir(),作用获取一个对象的所以方法,有__iter__就是可迭代对象
s = "tzh"
print('__iter__' in dir(s))
#返回true
二、迭代器
-
定义:
- 字面意思:可更新迭代的工具
- 专业角度:内部含有‘——iter——’或者‘——next——’方法的对象就是迭代器
-
判断方法:
# dir(),作用获取一个对象的所以方法,有__iter__就是可迭代对象 li = ["tzh"] print('__iter__' in dir(li) and '__next__' in dir(li))
2.1、可迭代对象转换成迭代器
- 优点:
- 节省内存
- 惰性机制,取值一次取一个!
- 缺点:
- 速度慢
- 不走回头路,只能next,不能回去
s = 'tzhqwe'
obj = iter(s) #等价于s.__iter__()
print(obj) #是不可以直接看到数据的
#那怎么看呢?
#这样只打印第一个字母,也就是t
#next一次打印一次,多了会报错哦
print(next(obj)) #等价于obj.__next__()
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
------
li = [1,2,3,4,5]
obj = iter(li)
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
三、可迭代对象与迭代器对比
- 可迭代器对象是一个操作方法比较多,输出比较直观,存储数据相对少的数据集
- 应用:测重于对数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。(说白了,丢到字典、列表里面)
- 是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。
- 应用:当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。(可参考为什么python把文件句柄设置成迭代器)。