【问题标题】:Explanation of range with slice用切片解释范围
【发布时间】:2019-09-11 10:17:04
【问题描述】:

456 是如何变成459 的?

>>> a = range(123, 456, 7)[1::4]  
>>> print(a)
range(130, 459, 28)

【问题讨论】:

    标签: python python-3.x range slice


    【解决方案1】:

    开始吧。

    a = range(123, 456, 7)
    print(list(a))
    #[123, 130, 137, 144, 151, 158,.....431, 438, 445, 452]
    

    即我们得到一个从 123 到 456 的列表,步长为 7

    然后我们尝试下一步。

    a = range(123, 456, 7)[1::4]
    print(list(a))
    #[130, 158, 186, 214, 242, 270, 298, 326, 354, 382, 410, 438]
    

    相当于 range 以 130 开头,步长为 28,最后一个值为 459,即range(130, 459, 28),这也告诉你从第 1 个开始,从 range 中取每 4 个元素元素。

    【讨论】:

      【解决方案2】:

      您的两个结果基本上相同

      在 python 3 中 ranges 是 immutable sequences,在 python 2 中它们返回一个列表:

      a = range(123, 456, 7)[1::4]  # generate a range spaced 7 apart, take every 4th
      

      python 2.7:

      print(a) 
      > [130, 158, 186, 214, 242, 270, 298, 326, 354, 382, 410, 438]
      

      pyton 3.6:

      print(a)
      > range(130, 459, 28)
      
      print(*range(130, 459, 28))
      > 130 158 186 214 242 270 298 326 354 382 410 438
      

      您的切片告诉range 在其 7 间距范围内仅获取每 4 个元素。 4*7 == 28:这就是range“变化”的原因。

      重新计算 range-slice 将其上限更改为 startvalue + 步长的倍数 - 并且 range 的上限是排他性的,因此它是否被称为 @ 并不重要987654330@ 或 459439 - 只要大于您在该范围内最后生成的数字即可。

      【讨论】:

      • Python 3 的 range 对象不是迭代器。您可以反复迭代它们。你也不能直接在一个上调用next(你需要先将它传递给iter,以获得一个实际的迭代器)。
      • Python 3 range 不是迭代器。它仍然是一个序列。它现在只是按需生成项目。
      • @Blckknght 感谢您的更正,修复,添加参考文档
      【解决方案3】:

      请注意,如果您制作的切片不会改变任何内容,也会发生这种情况:

      >>> b = range(123, 456, 7)
      >>> print(b[::1])
      range(123, 459, 7)
      

      该范围中包含的最后一个数字是 452,因此任何值 452 < stop <= 459 都会为您提供相同的输出。鉴于未包括的第一个值是步长为 1 的停止,因此将其用于其他步骤也更加一致;它允许您通过从停止中减去步长来快速确定 包含的最后一个值是什么。


      知道的是,为什么 28 的新步骤没有遵循该逻辑;在此基础上,如果结果是:

      >>> b[1::4]
      range(130, 466, 28)
      

      因此您可以轻松计算出最后包含的值是 438。但是,任何值 438 < stop <= 466 都会给出相同的输出,因此 459 并不是完全错误的。

      【讨论】:

        猜你喜欢
        • 2018-02-20
        • 2019-05-16
        • 2012-12-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-07
        • 1970-01-01
        • 2018-09-28
        • 1970-01-01
        相关资源
        最近更新 更多