繁体   English   中英

反向实际反转Python迭代器吗?

[英]Does reverse actually reverse a Python iterator?

所以我可以在列表上创建一个反向迭代器:

list(reversed([0,1,2,3]))

[3, 2, 1, 0]

我假设这只是从索引len(...)-10调用getitem 但是我不能这样做:

list(reversed(xrange(4)))

[3, 2, 1, 0]

现在我有点困惑。 这是否从xrange(4)创建列表然后反转它? 如果没有,它如何知道最后一个元素是什么以及如何倒退? 我阅读了文档,但没有用。

reversed()在对象上查找__reversed__特殊方法 列表对象提供了这个, xrange()也是如此:

>>> xrange(4).__reversed__()
<rangeiterator object at 0x106e2fa50>

迭代器对象只是反向生成值,不生成列表对象。

对于实现__reversed__对象, reversed()函数使用length和__getitem__方法; 例如reversed()基本上相当于:

def reversed(seq):
    try:
        return seq.__reversed__()
    except AttributeError:
        return (seq[i] for i in xrange(len(seq) - 1, -1 , -1))

其中第二部分是生成器表达式,懒惰地进行评估。 然后,生成器依次从索引(长度-1)开始依次访问每个项目到索引0。

reversed()只能接受一个序列 - 如果它采用泛型迭代器,它无法知道最终值是什么,而不会耗尽迭代器并存储所有值。

幸运的是, xrange返回一个xrange对象作为序列:

>>> x = xrange(10)
>>> len(x)
10
>>> x[9]
9

它也碰巧有一个实际的__reversed__方法,但这是一个拥有所有序列方法的特殊情况。

只是比较两者:

In [2]: reversed(xrange(4))
Out[2]: <rangeiterator at 0x7fa83291bde0>

In [3]: list(reversed(xrange(4)))
Out[3]: [3, 2, 1, 0]

In [4]: reversed([0,1,2,3])
Out[4]: <listreverseiterator at 0x7fa8328be2d0>

In [5]: list(reversed([0,1,2,3]))
Out[5]: [3, 2, 1, 0]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM