迭代器

发布时间 2023-11-29 11:16:14作者: Magiclala

迭代器iterator: 

提到迭代器,最典型的就是for循环

for 变量 in 可迭代:
    pass

可迭代对象:

是指可以使用 for 循环进行遍历的对象。除了字符串 (str)、列表 (list)、元组 (tuple)、字典 (dict)、集合 (set) 和文件对象 (open()) 之外,还有其他一些常见的可迭代对象,例如生成器对象、range 对象等。

通常,容器类型的对象都是可迭代的(如字符串、列表、元组、字典、集合等),不是容器类型的对象都不是可迭代的。

不可迭代的对象:

通常是指那些不支持使用 for 循环进行遍历的对象(不是容器类型的对象)。例如:

  1. 整数 (int) 和浮点数 (float): 直接的数字类型是不可迭代的。
    for c in 123456:
        print(c)
        
    #运行结果
    Traceback (most recent call last):
      File "D:\装饰器.py", line 1, in <module>
        for c in 123456:
    TypeError: 'int' object is not iterable

    iterable: 可迭代的

  2. 布尔值 (bool): 布尔值也是不可迭代的。
    # 不可迭代的例子
    bool_value = True
    for b in bool_value:
        print(b)
  3. NoneType (None): None 也不可迭代。
    # 不可迭代的例子
    none_value = None
    for n in none_value:
        print(n)

可迭代的数据类型都会提供一个叫迭代器的东西. 这个迭代器可以帮我们把数据类型中的所有数据逐一的拿到

获取迭代器的两种方案:
    1. iter() 内置函数可以直接拿到迭代器
    2. __iter__() 特殊方法

从迭代器中拿到数据:
    1. next() 内置函数
    2. __next__()  特殊方法

it = iter("你叫什么名字啊")

print(1,next(it))
print(2,next(it))
print(3,next(it))
print(4,next(it))
print(5,next(it))
print(6,next(it))
print(7,next(it))

print(8,next(it))    # StopIteration: 迭代已经停止了. 不可以再次从迭代器中拿数据了

#运行结果
Traceback (most recent call last):
  File "D:\迭代器.py", line 11, in <module>
    print(8,next(it))
            ^^^^^^^^
StopIteration
1 你
2 叫
3 什
4 么
5 名
6 字
7 啊

for里面一定是要拿迭代器的. 所以所有不可迭代的东西不能用for循环
for循环里面一定有__next__出现

总结: 迭代器统一了不同数据类型的遍历工作

迭代器本身也是可迭代的
迭代器本身的特性:
    1. 只能向前不能反复
    2. 特别节省内存
    3. 惰性机制

案例1:

it = iter("你叫什么名字啊")

print(1,next(it))
print(2,next(it))
print(3,next(it))
print(4,next(it))
print(5,next(it))
print(6,next(it))
print(7,next(it))

print(8,next(it))    # StopIteration: 迭代已经停止了. 不可以再次从迭代器中拿数据了

#运行结果
Traceback (most recent call last):
  File "D:\迭代器.py", line 11, in <module>
    print(8,next(it))
            ^^^^^^^^
StopIteration
1 你
2 叫
3 什
4 么
5 名
6 字
7 啊

迭代器的特性