反向迭代和迭代切片
-
反向迭代
问题:你想反方向迭代一个序列
通常做法:使用内置的 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
>>>
网友评论