当范围反转时为什么要使用 range_iterator? [英] Why a range_iterator when a range is reversed?

查看:49
本文介绍了当范围反转时为什么要使用 range_iterator?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以为 range 对象添加下标:

<预><代码>>>>r = 范围(4)>>>r范围(0, 4)>>>r[3]3>>>对于 r 中的 i:打印(一)0123>>>列表(r)[0, 1, 2, 3]

但是,如果我在同一个 range 对象上调用 reversed:

<预><代码>>>>r = 反转(范围(4))>>>r<在 memaddr 的 range_iterator 对象>>>>对于 r 中的 i:打印(一)3210>>>r[3]类型错误:'range_iterator' 对象不可下标 # ?>>>范围(r)TypeError: 'range_iterator' 不能解释为整数 # ?>>>列表(r)[] # ?嗯

嗯……表现得有点像发电机,但没啥用.

反向范围对象在嘎嘎声方面是否与普通的生成器/迭代器不同?

解决方案

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆