迭代器原理 、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进行循环)
其中第一条,无论是可迭代对象还是迭代器本身,调用iter方法,都会转换成迭代器对象。迭代器调用iter方法返回的还是自己,没有变化。所以在这一点上,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
本文来自博客园,作者:中州韵,转载请注明原文链接:https://www.cnblogs.com/zhongzhouyun/p/15313384.html