15. 迭代器

村里唯一的运维 / 2023-05-11 / 原文

1. 概述

能被next调用,并不断返回下一个值的对象(迭代器是对象)

2. 迭代器的特点及优点

特点

迭代器会生成惰性序列,它通过计算依次的把值返回,一边循环一边计算而不是一次性得到所有的数据

优点

需要的时候,一次取一个,可以大大节省内存空间,而不是一股脑把所有的数据放进内存

总结

1. 惰性序列,节省内存空间
2. 遍历获取值得时候使用next,方向不可逆
3. 迭代器可以遍历无限量大的数据

3. 可迭代对象

如何判定是一个可迭代对象

__iter__ : 如果数据类型当中含有这个方法,那么它就是一个可迭代对象
dir: 可以查看当前数据类型的内存成员,从而查看是否有__iter__这个方法

示例

setvar = {1,"a",2,"b"}
res = dir(setvar)
print(res)

image.png

4. 迭代器

如何变成迭代器

方法1:(推荐使用)
    iter(可迭代对象)
方法2:
    可迭代对线.__iter__()

如何调用迭代器

方法1:(推荐使用)
    next(迭代器)
方法2:
    迭代器.__next__()

如何判定迭代器

含有__iter__和__next__这2个方法,同时存在就是迭代器,2者缺一不可

总结: 可迭代对象不一定是迭代器因为可迭代只具有__iter__即可,但是迭代器一定是可迭代对象

用py提供的方法来判断是迭代器还是可迭代对象

from collections.abc import Iterable,Iterator
# Iterable:表示可迭代对象 Iterator:表示迭代器
setvar = {1,"a",2,"b"}
res = dir(setvar)
print(res)
res1 = isinstance(setvar,Iterator)
res2 = isinstance(setvar,Iterable)
print(res1) False
print(res2) True



from collections.abc import Iterable,Iterator
res3 = isinstance(range(10),Iterator)
res4 = isinstance(range(10),Iterable)
print(res3) False
print(res4) True

遍历迭代器

方法1: 通过for循环来遍历,如果数据量特别大就不适用了
it = iter(range(100))
for i in it:
    print(i)

    
方法2: 通过for循环配合next来遍历迭代器
it = iter(range(1000000))
for i in range(100):
    res = next(it)
    print(res)