一、可迭代对象
定义:可以进行循环更新的一个实实在在的值,内部含有__iter__
方法的对象,叫可迭代对象,如,str list dict set range
- 优点:
- 存储的数据能直观显示,比较直观
- 拥有方法比较多
- 缺点:
- 占用内存
- 不能直接通过for循环,不能直接取值,(能取值是应为内部做了转换)
s1 = 'sadf'
print('__iter__' in dir(s1)) # 判断s1变量是否为可迭代对象
print('__iter__' in dir(range)) # 判断ranage是否为可迭代对象
# dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。
可迭代对象:操作方法比较多,比较直观,存储数据相对少的数据集(几百万个对象8G内存),当你侧重于对数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择
二、迭代器
定义:内部含有__iter__
方法并且含有__next__
方法的对象就是迭代器
- 优点:
- 节省内存,在内存当中只占一行内存
- 惰性机制,next一下,取一个值,绝对不多取
- 缺点:
- 速度慢,时间换空间
- 不走回头路
# 判断文件句柄是否为一个迭代器
with open('bb.txt',encoding='utf-8',mode='r') as f:
print(('__iter__' in dir(f) and '__next__' in dir(f)))
#判断变量s1是否为迭代器
s1 = 'sadf'
print(('__iter__' in dir(s1) and '__next__' in dir(s1)))
l1 = [1, 3, 4, 4, 5]
obj = iter(l1) # 转换列表为迭代器
print(next(obj)) # 一起取一个值,超出会报错
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
l1 = [ i for i in range(1,10)]
obj = iter(l1)
for i in range(3):
print(next(obj))
for i in range(4):
print(next(obj))
# 不走回头路,会记住上一次取值的位置,下一次接着取值(只要程序不停止)因此这里打印1-7
迭代器:是一个非常节约内存,可以记录存储位置,可以直接通过循环next方法取值,但是不直观,操作方法比较单一,因此当你数据量比较大的时候或者以节约内存为首选,将数据设置成可迭代器是不错的选择
利用while循环模拟for循环对可迭代对象进行取值的机制
l1 = [ i for i in range(1,10)]
obj = iter(l1)
while 1:
try:
print(next(obj))
except StopIteration: # 如果出现StopIteration错误停止程序
break