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

反向迭代和迭代切片

  • 反向迭代
    问题:你想反方向迭代一个序列
    通常做法:使用内置的 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 "", line 1, in 
    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】迭代器与生成器(二))