美文网首页
关于可迭代对象与迭代器的一点思考

关于可迭代对象与迭代器的一点思考

作者: Rokkia | 来源:发表于2017-06-04 22:02 被阅读19次

    list ,dic ,str 都是可迭代对象

    那么什么是可迭代对象呢?
    很简单,可以理解为 可以直接作用于for循环的对象统称为可迭代对象

    如:

    l = [1, 2, 3, 4]
    s = "abcd"
    for x in l:
        print(x)
    1
    2
    3
    4
    

    l 我们可以迭代循环

    for x in 5:
        print(x)
    TypeError: 'int' object is not iterable
    

    但是int类型的5 就不是iterable
    当然如果想要验证一个对象是否是一个可迭代对象可以通过isinstance

    #记得要import Iterable哦 否则会报错哦!
    In [20]: from collections import Iterable, Iterator
    
    In [21]: isinstance(l, Iterable)
    

    什么是迭代器呢?简单的可以理解为:
    可以被next()函数调用并不断返回下一个值的对象称为迭代器。

    怎么获得迭代器呢?
    由可迭代对象获得迭代器
    我们可以通过iter方法

    In [22]: iter(l)
    Out[22]: <listiterator at 0x103f72fd0>
    

    可以看到out里我们返回的是一个listiterator类型,也就是一个迭代器对象。
    我们如何获取验证一个对象是否是迭代器呢?同样,我们可以通过isinstance来验证。

    In [46]: isinstance(iter(l), Iterator)
    Out[46]: True
    
    思考时间

    for循环的时候 究竟都干了些什么 ?
    很简单,首先将in后面的对象通过iter方法将对象转换成迭代器,然后再执行。
    迭代器怎么执行呢?
    通过next方法。

    In [25]: i = iter(l)
    
    In [26]: i.next()
    Out[26]: 1
    
    In [27]: i.next()
    Out[27]: 2
    
    In [28]: i.next()
    Out[28]: 3
    
    In [29]: i.next()
    Out[29]: 4
    
    In [30]: i.next()
    ---------------------------------------------------------------------------
    StopIteration                             Traceback (most recent call last)
    <ipython-input-30-e590fe0d22f8> in <module>()
    ----> 1 i.next()
    

    调用next方法查看迭代器中是否还有值,如果没有了则抛出StopIteration异常。

    下面我们来写一个可迭代对象与迭代器看一下。

    迭代器,因为我们使用iterable的时候需要返回一个iterator所以我们先定义迭代器
    In [43]: class DemoIterator(Iterator):
        ...:     def __init__(self, arr):
        ...:         self.arr = arr
        ...:         self.index = 0
                 #注意这里是next哦  不是__next__开始写的时候就犯了这个错
        ...:     def next(self):
        ...:         if self.index == len(self.arr):
        ...:             raise StopIteration
        ...:         ob = self.arr[self.index]
        ...:         self.index += 1
        ...:         return ob
    

    可迭代对象

    In [40]: class DemoIterable(Iterable):
        ...:     def __init__(self, arr):
        ...:         self.arr = arr
                 #实现这里的__iter__方法
        ...:     def __iter__(self):
        ...:         return DemoIterator(self.arr)
    

    ok下面就需要验证了

    In [44]: for x in DemoIterable([1,2,3,4]):
        ...:     print x
        ...:     
    1
    2
    3
    4
    

    成功。

    相关文章

      网友评论

          本文标题:关于可迭代对象与迭代器的一点思考

          本文链接:https://www.haomeiwen.com/subject/zydvfxtx.html