8

根据 Python 文档,当我执行 range(0, 10) 时,此函数的输出是从 0 到 9 的列表,即 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。然而,尽管有很多这样的在线工作示例,但我的 PC 上的 Python 安装并没有输出这个。

这是我的测试代码...

test_range_function = range(0, 10)
print(test_range_function)
print(type(test_range_function))

我想这个的输出应该是打印出来的列表,type函数应该把它输出为一个列表。相反,我得到以下输出......

c:\Programming>python range.py
range(0, 10)
<class 'range'>

我在网上的任何示例中都没有看到这一点,并且非常感谢对此有所了解。

4

3 回答 3

18

这是因为在 Python 3 中range,其他函数式方法(例如mapreducefilter)返回迭代器。在 Python 2 中,它们返回列表。

Python 3.0 的新特性

range()现在表现得像以前一样xrange(),除了它适用于任意大小的值。后者不再存在。

要将迭代器转换为列表,您可以使用以下list函数:

>>> list(range(5)) #you can use list()
[0, 1, 2, 3, 4]
于 2013-05-17T22:35:47.620 回答
6

通常,您不需要将范围具体化为实际列表,而只是想对其进行迭代。因此,特别是对于较大的范围,使用迭代器可以节省内存。

由于这个原因range(),在 Python 3 中返回一个迭代器(就像xrange()在 Python 2 中一样)。list(range(..))如果您出于某种原因想要一个实际列表,请使用。

于 2013-05-17T22:37:17.797 回答
0

range() 不返回迭代器,它不是迭代器,它是可迭代的。迭代器协议有 2 种方法。__iter____next__

 r=range(10) 
  '__ iter __' in dir(r) # True
  `__ next __` in dir(r) # False

可迭代协议需要__iter__返回一个迭代器。

r.__iter__()
# <range_iterator object at 0x7fae5865e030>

range() 使用惰性求值。这意味着它不会预先计算和存储range(10). 它的迭代器 range_iterator 一次计算并返回一个元素。这就是为什么当我们打印一个范围对象时,我们实际上并没有看到范围的内容,因为它们还不存在!。

于 2021-01-12T16:33:50.697 回答