亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用切片解釋范圍

用切片解釋范圍

至尊寶的傳說 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 關注
  • 226 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號