当范围反转时为什么要使用 range_iterator? [英] Why a range_iterator when a range is reversed?
问题描述
我可以为 range
对象添加下标:
但是,如果我在同一个 range
对象上调用 reversed
:
嗯……表现得有点像发电机,但没啥用.
反向范围对象在嘎嘎声方面是否与普通的生成器/迭代器不同?
reversed
函数返回一个迭代器,而不是一个序列.这就是它的设计方式.您看到的 range_iterator
本质上是在您似乎想要的反向 range
上调用的 iter
.
要获得反向序列而不是反向迭代器,请使用外星人笑脸"切片:r[::-1]
(其中 r
是您的值来自 range
).这适用于 Python 2(其中 range
返回一个列表)和 Python 3(其中 range
返回一个类似序列的 range
对象).
I can subscript a range
object:
>>> 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]
But, if I call reversed
on the same range
object:
>>> 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
Hmm... Acting kinda like a generator but less useful.
Is there a reason a reversed range object isn't like a normal generator / iterator in how it quacks?
The reversed
function returns an iterator, not a sequence. That's just how it's designed. The range_iterator
you're seeing is essentially iter
called on the reversed range
you seem to want.
To get the reversed sequence rather than a reverse iterator, use the "alien smiley" slice: r[::-1]
(where r
is the value you got from range
). This works both in Python 2 (where range
returns a list) and in Python 3 (where range
returns a sequence-like range
object).
这篇关于当范围反转时为什么要使用 range_iterator?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!