迭代器和可迭代对象

一、可迭代对象

定义:可以进行循环更新的一个实实在在的值,内部含有__iter__方法的对象,叫可迭代对象,如,str list dict set range

  • 优点:
    1. 存储的数据能直观显示,比较直观
    2. 拥有方法比较多
  • 缺点:
    1. 占用内存
    2. 不能直接通过for循环,不能直接取值,(能取值是应为内部做了转换)
s1 = 'sadf'
print('__iter__' in dir(s1))  # 判断s1变量是否为可迭代对象

print('__iter__' in dir(range)) # 判断ranage是否为可迭代对象


# dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。

可迭代对象:操作方法比较多,比较直观,存储数据相对少的数据集(几百万个对象8G内存),当你侧重于对数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择

二、迭代器

定义:内部含有__iter__方法并且含有__next__方法的对象就是迭代器

  • 优点:
    1. 节省内存,在内存当中只占一行内存
    2. 惰性机制,next一下,取一个值,绝对不多取
  • 缺点:
    1. 速度慢,时间换空间
    2. 不走回头路
# 判断文件句柄是否为一个迭代器
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
原文地址:https://www.cnblogs.com/jiangjunwang/p/13387789.html