迭代器

[!Note]

了解迭代器Iterator,可迭代对象Iterable的概念

通俗的说,可迭代对象是一堆可以被一个一个拿起来的东西,迭代器就作为拿的工具,如果可迭代对象是一堆苹果,那么迭代器就是手,如果可迭代对象是一辆辆在生产线上整备待发的汽车,那么迭代器就是叉车。在Python一些常见的数据类型中,像list set dict map 等,包括文件在内都是可迭代对象.

官方定义:

迭代对象,需要提供 __iter__()方法,否则不能被 for语句处理。

迭代器必须同时实现 __iter__()__next__()方法,__next__()方法包含了用户自定义的推导算法,这是迭代器对象的本质。

由此得出,如果一个对象是迭代器,那么它一定是可迭代对象,反之不成立,可以通过以下方法检查某个对象是不是可迭代对象或迭代器

from collections.abc import Iterable, Iterator

list = [1, 2, 3, 4]
print(isinstance(list, Iterable))   # True
print(isinstance(list, Iterator))   # False

with open("01_内置函数/test.txt", 'r', encoding='utf8') as file:
    print(isinstance(file, Iterable))   # True
    print(isinstance(file, Iterator))   # True

可以自定义一个类并创建实例验证以上的结论,新建一个Apple类, 先只实现__iter__方法,内部不写任何逻辑

class Apple:
    def __init__(self) -> None:
        self.names = ["Apple1", "Apple2", "Apple3", "Apple4"]

apple = Apple()
print(isinstance(apple, Iterable))   # False
print(isinstance(apple, Iterator))   # False

实现__iter__方法后,

class Apple:
    def __init__(self) -> None:
       self.names = ["Apple1", "Apple2", "Apple3", "Apple4"]

    def __iter__(self)-> None:
        pass

apple = Apple()
print(isinstance(apple, Iterable))   # True
print(isinstance(apple, Iterator))   # False

此时apple就已经被判定为一个可迭代对象,实现__iter__方法和__next__()方法后,

class Apple:
    def __init__(self) -> None:
        self.names = ["Apple1", "Apple2", "Apple3", "Apple4"]

    def __iter__(self)-> None:
        pass

    def __next__(self)-> None:
        pass

apple = Apple()
print(isinstance(apple, Iterable))   # True
print(isinstance(apple, Iterator))   # True

内置函数iter()next()

  • iter()的作用是从可迭代对象那里获取一个迭代器
  • next()的作用是从迭代器那里返回下一个值

重新声明一下Apple类中的方法,只声明__iter__(), 代表Apple的实例是一个可迭代对象

class Apple:
    def __init__(self) -> None:
        self.names = ["Apple1", "Apple2", "Apple3", "Apple4"]

    def __iter__(self)-> None:
        pass

apple = Apple()
for a in iter(apple):
    print(a)