切片范围的说明

时间:2019-04-22 07:26:07

标签: python python-3.x range slice

456如何成为459

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

3 个答案:

答案 0 :(得分:1)

两者的结果本质上都是相同的。

在python 3中,rangeimmutable 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仅将第4个元素用于其7个间隔的范围。 4*7 == 28:这就是range“变化”的原因。

重新计算的范围切片将其上限更改为startvalue +您的步长的倍数-range的上限是互斥的,因此是否为称为456459439-只要它大于从范围中最后生成的数字,即可。

答案 1 :(得分: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]

与开始于130的范围等效,步长为28,最后一个值为459,即range(130, 459, 28),它还告诉您从范围开始取第4个元素第一个元素。

答案 2 :(得分:1)

请注意,如果您制作的切片没有任何变化,也会发生这种情况:

>>> 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并非完全错误。