美文网首页
【2017-09-21】迭代器与生成器(二)

【2017-09-21】迭代器与生成器(二)

作者: 小蜗牛的成长 | 来源:发表于2017-09-21 11:48 被阅读0次

    反向迭代和迭代切片

    • 反向迭代
      问题:你想反方向迭代一个序列
      通常做法:使用内置的 reversed() 函数
    >>> a=[1,2,3,4,5]
    >>> for x in reversed(a):
        print(x)
    
        
    5
    4
    3
    2
    1
    >>> 
    

      反向迭代仅仅当对象的大小可预先确定或者对象实现了__reversed__ ()的特殊方法时才能生效。如果两者都不符合,那你必须先将对象转换为一个列表才行。如果可迭代对象有很多元素时,需要消耗很大内存占用。因此可自定义一个反向迭代器。

    #示例:实现实现了` __reversed__ () `的特殊方法
    >>> class CountDown:
        def __init__(self,start):
            self.start=start
        def __iter__(self):
            n=self.start
            while n>0:
                yield n
                n-=1
        def __reversed__(self):
            n=1
            while n<=self.start:
                yield n
                n+=1
    >>> for rr in CountDown(4):
        print(rr)
    
        
    4
    3
    2
    1
    >>> 
    
    • 迭代器切片
      问题:在迭代器或者生成器上做切片操作,由于事先的长度位置及不能做索引操作,标准切片操作并不可用。
      方法:函数 itertools.islice() 正好适用于在迭代器和生成器上做切片操作。
      原理:它通过遍历并丢弃直到切片开始索引位置的所有元素。然后才开始一个个的返回元素,并直到切片结束索引位置。其中,值得注意的是:islice() 会消耗掉传入的迭代器中的数据。必须考虑到
      迭代器是不可逆的这个事实。
    #操作上述CountDown
    >>> cd=CountDown(10)
    >>> cd[2:8]
    Traceback (most recent call last):
      File "<pyshell#28>", line 1, in <module>
        cd[2:8]
    TypeError: 'CountDown' object is not subscriptable
    >>> import itertools
    >>> for x in itertools.islice(cd,2,8):
        print(x)
    
        
    8
    7
    6
    5
    4
    3
    >>> 
    

    None参数为默认值,它的使用类似[2:] 和 [:2]原理是一样的

    >>>#获取从第 8个到最后的所有元素
    >>> for x in itertools.islice(cd,2,None):
        print(x)
    
        
    8
    7
    6
    5
    4
    3
    2
    1
    >>> 获取前2个元素
    >>> for x in itertools.islice(cd,None,2):
        print(x)
        
    10
    9
    >>> 
    

    相关文章

      网友评论

          本文标题:【2017-09-21】迭代器与生成器(二)

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