456
如何成为459
?
>>> a = range(123, 456, 7)[1::4]
>>> print(a)
range(130, 459, 28)
答案 0 :(得分:1)
两者的结果本质上都是相同的。
在python 3中,range
是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
仅将第4个元素用于其7个间隔的范围。 4*7 == 28
:这就是range
“变化”的原因。
重新计算的范围切片将其上限更改为startvalue +您的步长的倍数-range
的上限是互斥的,因此是否为称为456
或459
或439
-只要它大于从范围中最后生成的数字,即可。
答案 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并非完全错误。