我可以下标range
个对象:
>>> r = range(4)
>>> r
range(0, 4)
>>> r[3]
3
>>> for i in r:
print(i)
0
1
2
3
>>> list(r)
[0, 1, 2, 3]
但是,如果我在同一个reversed
对象上调用range
:
>>> r = reversed(range(4))
>>> r
<range_iterator object at memaddr>
>>> for i in r:
print(i)
3
2
1
0
>>> r[3]
TypeError: 'range_iterator' object is not subscriptable # ?
>>> range(r)
TypeError: 'range_iterator' cannot be interpreted as an integer # ?
>>> list(r)
[] # ? uhmm
嗯......表演有点像发电机但不太有用。
是否有理由反转范围对象不像普通的生成器/迭代器那样嘎嘎叫?
答案 0 :(得分:6)
reversed
函数返回迭代器,而不是序列。这就是它的设计方式。您看到的range_iterator
基本上iter
会调用您想要的反向range
。
要获得反向序列而不是反向迭代器,请使用&#34;外星人笑脸&#34;切片:r[::-1]
(其中r
是您从range
获得的值)。这适用于Python 2(其中range
返回列表)和Python 3(其中range
返回类似序列的range
对象)。
答案 1 :(得分:1)
您需要将r
更改回list
类型。例如:
reversed([1,2]) #prints <listreverseiterator object at 0x10a0039d0>
list(reversed([1,2])) #prints [2,1]
为了澄清您的要求,这里有一些示例I / O:
>>> r = range(5)
>>> x = reversed(r)
>>> print x
<listreverseiterator object at 0x10b6cea90>
>>> x[2]
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
x[2]
TypeError: 'listreverseiterator' object has no attribute '__getitem__'
>>> x = list(x)
>>> x[2] #it works here
2