可迭代对象具有一个iter()方法,可迭代对象调用__iter__()方法以后返回一个迭代器对象。也就是说一个迭代器 具有iter 和next方法
以列表为例 a = [1,2,3,4]
a.__iter__() 返回一个迭代器对象
a.__iter__().__next__() 就可以进行迭代
for i in list: 的本质就是一个迭代器,它做的就是首先找到一个迭代器对象,iteration = list.__iter__(),然后 iteration.__next__()进行迭代
一个迭代器的源码:
class MyList(object):
def __init__(self):
self.items = []
def add(self, item):
self.items.append(item)
def __iter__(self):
my_iterator = MyIterator(self.items)
return my_iterator
class MyIterator(object):
def __init__(self, container):
self.i = 0
self.container = container
def __next__(self):
if self.i < len(self.container):
ret = self.container[self.i]
self.i += 1
return ret
else:
raise StopIteration
my_list = MyList() 这个对象就可以就可以进行迭代
my_list.add(100)
my_list.add(200)
for i in my_list:
print i
from collections import iterator
isinstance((my_list.iter()),iterator )
在pycharm 中返回false 因为迭代器本身也是一个可迭代对象,所以在class MyIterator(object): 还要定义一个iter方法,return self 返回自身就可以。
所以一个迭代器本身的写法可以写成:
class MyList2(object):
def __init__(self):
self.items = {}
def __iter__(self):
return self
def __next__(self):
pass
忽略掉容器的概念,每一次通过数学计算的方法来获取数据,这样数据太大占用内存空间的问题就解决了