目录
4.5 反向迭代
#1 list.reverse()
反向列表中的元素
>>> ls = [1,3,2,'b','a']
>>> ls.reverse()
>>> ls
['a', 'b', 2, 3, 1]
#2 reversed()
和 iter() 相反,对序列生成一个反向的迭代器
>>> ls
['a', 'b', 2, 3, 1]
>>> i = iter(ls)
>>> next(i)
'a'
>>> next(i)
'b'
>>> r = reversed(ls)
>>> next(r)
1
>>> next(r)
3
>>> next(r)
2
# 3. __reversed__()
reversed() 仅当对象的大小可预先确定,或者对象实现了 __reversed__()
的特殊方法时才能生效(这样才能被映射的内置函数Reversed()调用)。 如果两者都不符合,那你必须先将对象转换为一个列表才行,如果可迭代对象元素很多的话,将其预先转换为一个列表要消耗大量的内存。
可以通过在自定义类上实现 __reversed__()
方法来实现反向迭代:
object.__reversed__(self)
此方法(如果存在)会被 reversed() 内置函数调用以实现逆向迭代。它应当返回一个新的以逆序逐个迭代容器内所有对象的迭代器对象。
如果未提供 __reversed__() 方法,则 reversed() 内置函数将回退到使用序列协议 (__len__() 和 __getitem__())。支持序列协议的对象应当仅在能够提供比 reversed() 所提供的实现更高效的实现时才提供 __reversed__() 方法。
4.7 迭代器切片
itertools.
islice
(iterable, start, stop[, step])
>>> ls = [x for x in range(10)]
>>> ls
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> i = iter(ls)
#迭代器不支持直接切片
>>> i[2,5]
Traceback (most recent call last):
File "<pyshell#107>", line 1, in <module>
i[2,5]
TypeError: 'list_iterator' object is not subscriptable
#itertools.islice()
>>> import itertools
>>> for x in itertools.islice(i,2,5):
print(x)
2
3
4
实际上 itertools.islice()第一个参数是
iterable,即