为了账号安全,请及时绑定邮箱和手机立即绑定

用切片解释范围

用切片解释范围

至尊宝的传说 2022-01-18 15:49:20
怎么456变成的459?>>> a = range(123, 456, 7)[1::4]  >>> print(a)range(130, 459, 28)
查看完整描述

3 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

你的两个结果本质上是一样的。


在 python 3range中是不可变序列,在 python 2 中它们返回一个列表:


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

蟒蛇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

您的切片告诉range7 间隔范围内仅采用每 4 个元素。4*7 == 28: 这就是为什么range“变化”。


重新计算的范围切片将其上限更改为 startvalue + 步长的倍数 - 并且 的上限是独占的,因此是否range调用它并不重要- 只要它大于您生成的数字最后从范围。456459439


查看完整回答
反对 回复 2022-01-18
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

首先。


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 个元素开始,从该范围中取出每个第 4 个元素。


查看完整回答
反对 回复 2022-01-18
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

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


>>> 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 并不是完全错误的。


查看完整回答
反对 回复 2022-01-18
  • 3 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信