【问题标题】:What's the difference in statements below to get a range?下面的语句有什么区别来获得一个范围?
【发布时间】:2014-08-05 03:16:09
【问题描述】:

当我阅读 Django 票证和拉取请求时,我发现它们有以下变化:

他们想得到一个关于页码的范围,并从

return range(1, self.num_pages + 1) # 1

到:

return six.moves.range(1, self.num_pages + 1) # 2

然后:

 return list(six.moves.range(1, self.num_pages + 1)) # 3

我很困惑 1 和 3 之间有什么区别?而且为什么不只是这个,和3有什么区别吗?

 return list(range(1, self.num_pages + 1)) # 4

【问题讨论】:

    标签: python django python-3.x


    【解决方案1】:

    来自Python documentation

    Python 3 重新组织了标准库并移动了几个函数 到不同的模块。六为它们提供了一致的接口 通过伪造的six.moves 模块。

    在同一页面中,它告诉我们six.moves.range() 调用 Python 2 的 xrange() 和 Python 3 的 range()xrange()range() 非常相似,除了它返回一个 xrange 对象而不是list。因此调用周围的list() 使其变为list

    似乎更改的全部目的是使代码同时适用于 Python 2 和 Python 3。

    【讨论】:

    • 3和4有区别吗?在 python2 和 python3 中都返回一个列表。
    • 夜景……你应该看看他放在那里的文档。 python2中的xrange和range不一样。 python3中的范围是xrange。 xrange 对于较大的集合更有效,因为它只是逐位生成“列表”,而不是一次全部生成。
    • 感谢您的回复,我已阅读文档。 xrange 在 python2 中比 range 更高效。但是在 python2 中 list(xrange(some_num))list(range(some_num)) 更有效吗?还是一样?
    • 夜景,看起来六模块允许运行时动态选择xrange(如果python2正在运行),或者range(如果python3正在运行)。所以无论哪种方式你都会赢。它更有效,并且调用 import 让它总是发生。
    【解决方案2】:

    range 在 Python 2.X 中是构造一个新列表。所以,例如:

    range(4) == [0, 1, 2, 3]
    

    Python 2.X 中的xrange 是一个生成器,它可以延迟生成与range 返回的值相等的值,而不会产生任何内存开销。

    Python 3.X 摆脱了range,将其替换为xrangexrange 的行为通常更有效,但如果您确实需要使用范围构造列表,则必须显式迭代它或使用 list 构造函数。

    range 在 Python 2.X 中返回一个列表。在 Python 3.X 中:

    >>> type(range(4))
    <class 'range'>
    

    要在 Python 3 中显式创建具有范围的列表,只需执行以下操作:

    list(range(4)) == [0, 1, 2, 3]
    

    或者

    my_list = [ x for x in range(4) ]
    

    【讨论】:

      【解决方案3】:

      似乎这个 SO 问题可以提供一些指导:six.moves.builtins.range is not consistent in Python 2 and Python 3,它确实对我有用。看起来他们是为了效率而做出改变的。

      【讨论】:

        猜你喜欢
        • 2021-11-26
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-16
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多