因此,我可以在列表上创建一个反向迭代器:
list(reversed([0,1,2,3]))
[3, 2, 1, 0]
我假设这只是从索引
getitem
到len(...)-1
调用0
。但是后来我也不能这样做:list(reversed(xrange(4)))
[3, 2, 1, 0]
现在我有点困惑。这会从
xrange(4)
创建列表,然后将其反转吗?如果不是,它如何知道最后一个元素是什么以及如何向后退?我读了documentation,但没有帮助。 最佳答案
reversed()
在对象上寻找 __reversed__
special method。列表对象提供了此功能,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。
关于python - 反向是否真的反向了Python迭代器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25138142/