iterator

关于iterator ,本节主要讲如下几方面python

第一 、什么是迭代。什么是可迭代的,也就是iterable。网站

第2、这些容器,和iterator 是什么关系。iterator又是什么?spa

第3、__iter__ 方法 和__next__方法 ,建立一个迭代器对象。对象

 

第1、什么是迭代。什么是可迭代的。blog

看了不少篇文章所,说迭代就是 ,被for循环做用,循环出来一个一个值就,这种遍历就叫作迭代(没毛病),那么什么是iterable ,就是可迭代的对象,简单来说就是能被for循环迭代的对象,称这些对象为可迭代的,例如能被for循环做用的有str ,list , tuple ,dict , set。这5种都是iterable内存

 

第2、这些容器,和iterator 是什么关系。iterator又是什么?utf-8

我在外国网站上,看到那些能存放多个元素的数据类型都叫作容器(container),就是这个几个str ,list , tuple ,dict , set ,而咱们上文提到过,这些是能够被for循环做用,读取其中每个元素的,资源

那么能被for循环是container的特性 吗?不,我有一篇文章写过生成器,为何会出现生成器这个东西,其实就是由于不想这些容器,放很是多的元素,而后一次性加载到内存中,这样占用很是大的资源。generator

一样的道理,iterator 就是解决这个问题的,迭代器是访问集合元素的一种方式,从头访问到尾,迭代器不要求你实现,提早将被迭代的元素转备好,而是能够迭代到具体元素时在计算出该元素。it

(这他妈不就是生成器吗?我此时内心想的是,因此我想了一些generator和iterator的区别,下面讲)。而被迭代以前,这个元素是能够不存在的,很简单是由于被计算出来的。因此咱们这些container在被for循环做用时,其实是经过iter()方法,将容器变成了一个iterator。而后,经过next()方法调用这个iterator,next()作两件事,第一个是返回当前元素,第二个是为返回下一个元素作准备,请看下面一个示例

 

# -*- coding: utf-8 -*-
#@Author: Eric



class Myiterator():
    def __init__(self,itertable):
        self.iterable = itertable
        self.index = 0


    def __iter__(self):

        return self


    def __next__(self):

        while True:
            try:
                value = self.iterable[self.index]

                self.index+=1
            except StopIteration as e:
                print('迭代完成了')

            return value

obj =Myiterator([1,3,4,5,6,7])

print(obj)
print(next(obj))
print(next(obj))

  

 上述这个实例 ,的__iter__方法就是,系统内置的iter()方法 ,将可迭代的对象放入iter()方法中,返回一个迭代器iterator , ,而迭代器是能够被for做用迭代的,内部实现的过程,就类型里面的,__next__()里面的方法。

 

第3、__iter__ 方法 和__next__方法 ,建立一个迭代器对象。

在提这两个方法以前,咱们先说一下迭代器协议 :迭代器对象必须有一个next() 方法,next()执行,只有两个结果,要么是返回迭代器对象的下一个元素,要么是是出发Stopiteration的报错

而咱们上文提到了iter()和next()两个方法 ,其实对应在内部实现的就是,__iter__ 方法 和__next__方法。__iter__() 方法是用来返回一个迭代器,而迭代器是经过迭代器协议规定,只须要包含一个符合规则的next(),那么这个东西就是迭代器,

而迭代器自己也是能够迭代的,因此,上面代码中,返回了self就是能够理解的。由于上面那么类,自己就是为了实例化一个迭代器的。

 

 

总结一下 :一、迭代是一个过程 , 就是被for循环做用,从前到后循环读取一个一个元素的过程,直到循环完全部元素。

                   二、 迭代器, 实际上是一种从容器中中获取元素的一种方式 ,从头至尾,并且不须要你提早将被迭代的全部数据提早准备好,只须要被迭代时被计算出来便可。

                   三、迭代器协议,规定迭代器对象中要包含__iter__(),返回本身,而且自身含有__next__()方法做用,返回iterator的下一个元素,或者在迭代结束时,抓取Stopiteration的异常。

                  四、 什么是可迭代的对象, 就是指上文提到的那些容器 ,能够被iter()生成一个迭代器 。生成一个迭代器起了,天然不就有next()方法了,也就能被迭代了。

相关文章
相关标签/搜索