【问题标题】:Why Is the Output of My Range Function Not a List?为什么我的范围函数的输出不是列表?
【发布时间】:2021-01-13 00:33:50
【问题描述】:

根据 Python 文档,当我执行 range(0, 10) 时,此函数的输出是一个从 0 到 9 的列表,即 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。然而,我的电脑上的 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'>

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

【问题讨论】:

  • 你读过 3.x 版本的 python 文档吗?要获取列表,您必须执行list(range(0, 10))
  • 这是从 2.x 到 3 的更改,记录在这里:docs.python.org/3.0/whatsnew/…。大多数情况下,无论如何你最好使用迭代器,但是如果你确实需要它,arbauthc 的评论会显示创建列表。
  • 如果您正在查看Python documentation online,请始终确保您正在阅读您正在使用的版本的文档。每个页面的左上角都有一个小选项菜单显示,例如“2.7.5”,您可以将其更改为“3.3”。
  • 感谢所有回复,我觉得不看正确的 Python 文档很愚蠢,但希望我不会再犯这个错误!
  • @FiveAlive:好吧,即使我知道得更多,仍然会犯这个错误。 (为什么print 函数在我传递两个值时打印一个元组,这两个值都不是元组?!)你认为我们怎么能这么快就认识到这个问题? :)

标签: python python-3.x


【解决方案1】:

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

What’s New In Python 3.0:

range() 现在的行为类似于 xrange() 过去的行为,除了它适用于 任意大小的值。后者不再存在。

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

>>> list(range(5)) #you can use list()
[0, 1, 2, 3, 4]

【讨论】:

    【解决方案2】:

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

    因此,Python 3 中的 range() 会返回一个迭代器(正如 Python 2 中的 xrange() 所做的那样)。如果出于某种原因需要实际列表,请使用 list(range(..))

    【讨论】:

    • +1,这解释了改变的原因以及为什么它更好。一个小的、微妙的区别 - 3.x 中的 range() 返回一个可迭代的,而不是一个迭代器。与直接迭代器相比,它有一些优势,比如循环时不会耗尽,而且它是一个序列,所以你可以对它进行切片等等......range(10)[:5] == range(0, 5)
    • ... 它还实现了 O(1) __contains__。所以当新手写5 in range(1, 21, 2)(他们总是这样)时,这不再是一个错误,而是实例良好且完美地道的代码。
    【解决方案3】:

    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 一次计算并返回一个元素。这就是为什么当我们打印一个范围对象时,我们实际上并没有看到范围的内容,因为它们还不存在!。

    【讨论】:

      猜你喜欢
      • 2013-12-06
      • 1970-01-01
      • 2017-11-11
      • 2021-07-15
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多