迭代器

可迭代对象具有一个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

 忽略掉容器的概念,每一次通过数学计算的方法来获取数据,这样数据太大占用内存空间的问题就解决了

1、  迭代是 访问集合元素的一种方式,生成器是一种特殊的迭代器
  迭代器是可以记住遍历的对象的位置。
  列表可以迭代,即遍历,但不是迭代器。
2、通过__iter__方法我们可以把一个可迭代对象变成一个迭代器。
  f=[1,2,3,]
  iter(f)
3、即 g =iter(f)
  next(g)
---------------------------------------------------------------------------------------------
4、判断一个对象是否可以迭代
  from collections import Iterable
 
  isinstance([],Iterable)
 
  判断一个对象是否是迭代器
    from collections import Iterator
 
    isinstance([],Iterator)
-------------------------------------------------------------------
5、对象进行迭代的过程,过程中应该有一个“人”去记录每次访问到了第几条数据,以及位置,
  帮助我们进行数据迭代的“人”称为迭代器(Iterator)
 
  通过这个迭代器来依次获取对象中的每一个数据
-------------------------------------------------------------------------------------------------
6、list、tuple等都是可迭代对象,通过iter()函数获取这些可迭代对象的迭代器。
  然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据
--------------------------------------------------------------------------------------------------
7、iter()函数实际上就是调用了可迭代对象的__iter__方法。
  使用next()函数的时候,调用的就是迭代器对象的__next__方法,
  (Python3中是对象的__next__方法,Python2中是对象的next()方法)
life is short,i need python
原文地址:https://www.cnblogs.com/lvhonglei-python/p/7204715.html