迭代器原理 、for循环原理、自定义一个迭代器

迭代的概念:

  • 重复执行一段代码的过程称为一次迭代,和循环中的遍历概念不一样

可迭代对象:

  • 内置有__iter__`方法的叫做可迭代对象;

迭代器:

  • 内部实现了__iter____next__方法的类叫做迭代器,其中iter方法必须返回迭代器本身,next方法则必须返 回下一个 值,如果没有就抛出StopIteration异常。也可以说是 迭代取值的工具

为什么要有迭代器?

没有迭代器之前,我们虽然可以通过whiel循环迭代有序类型,

_list = [1, 2, 3, 4]

# for循环的方式,没有迭代器之前并不能直接使用 for i in _list
for i in range(len(_list)):
    print(_list[i])

# while方式
_index = 0
while _index < len(_list):
    print(_list[_index])
    _index += 1
    
"""对于列表勉强能够实现,但是对于其他无序的类型来说,比如字典,字典的每个key是没有规律的,这个时候就不能迭代了"""

有了迭代器之后,我们就可以迭代不同类型的对象,为迭代增加了一种统一的迭代取值方式,不过也有缺点,我如果想取第6个数,如果用迭代器的方式,得调用6次next才能得到,用索引就可以一次定位;

for循环的原理与迭代器的关系(实现了iter方法就可以被for进行循环)

迭代器原理 、for循环原理、自定义一个迭代器

其中第一条,无论是可迭代对象还是迭代器本身,调用iter方法,都会转换成迭代器对象。迭代器调用iter方法返回的还是自己,没有变化。所以在这一点上,for循环能够兼容两者;如下

迭代器原理 、for循环原理、自定义一个迭代器

自定义迭代器

"""
传入一个有序的对象,先经过iter生成迭代器,再调用next方法获取下一个数

"""


class Mail:

    def __init__(self, _list):
        self._list = _list
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index < len(self._list):
            _value = self._list[self.index]
            self.index += 1
            return _value

        raise StopIteration


from typing import Iterable,Iterator

m = Mail([1, 2, 3, 4])
print(isinstance(m, Iterator))

知识点:文件也是一个迭代器;所以可以通过for循环进行取值
如果文件数据过多时,如何读取不会保证内存崩溃?(面试题)
就可以通过迭代器的方式,用for循环,每次迭代取一行,这是其中一个解决办法

with open() as f: pass