不確定在range()
函數之後[ ]
內部的參數實際上是什麼。範圍(n)[x:y:z]
經驗:print (range(5)[::-2])
輸出:[4, 2, 0]
但如果[x:y:z]
代表[start:stop:step]
,然後當我把print(range(5)[4:-2:-2])
,輸出列表是[4]
而不是[4, 2, 0]
,不知道該如何工作。
不確定在range()
函數之後[ ]
內部的參數實際上是什麼。範圍(n)[x:y:z]
經驗:print (range(5)[::-2])
輸出:[4, 2, 0]
但如果[x:y:z]
代表[start:stop:step]
,然後當我把print(range(5)[4:-2:-2])
,輸出列表是[4]
而不是[4, 2, 0]
,不知道該如何工作。
在Python 3中,range()
創建了一個特殊的對象range
。在Python 2中,它創建了list
。
List element: 0 1 2 3 4
Index: 0 1 2 3 4
Backwards index: -5 -4 -3 -2 -1
因此,從指數4
將指數-2
真正從列表元素4
進入列表元素3
。既然你跳過所有其他元素,那麼你不會去3
,只會讓你僅僅是[4]
。
[x:y:z]代表[start:stop:jumps]在5範圍內,它將迭代0-4(包括0和4),既然z是負數,它將從4迭代到0有2個跳躍4 --- 3 --- 2(---代表跳躍)所以輸出是 4 ---(3)--- 2 ---(1)--- 0。 ------> ------->
編碼快樂
你是對的,這是[start:stop:step]
。請注意負開始和停止被定義爲在序列結束時開始。因此,對於以值2, 3, 4
結尾的範圍,停止-2
指的是3
(-1是最後一位,-2是倒數第二位等)。
所以你的情況,該範圍具有5的長度,從0開始,並在4結束啓動索引4,和端索引-2是5-2 = 3
處。到目前爲止,該指數指的是[3, 4]
。現在,從4開始,你有一個負的2步。所以你跳過3,結果只是[4]
。
如果你想[4, 2, 0]
,那麼你應該離開了車站:
>>> range(5)[4::-2]
[4, 2, 0]
實際上,你可以甚至離開了起點:
>>> range(5)[::-2]
[4, 2, 0]
但
range(5)[4:-2]
結果[]
。那麼如何range(5)[4:-2:-2]
結果[4]
?
切片在評估一次,之後另一個不是一個參數:
評估負停止後,range(5)[4:-2]
相當於range(5)[4:3]
。由於沒有指定步驟,因此將使用正數1的默認步驟。這意味着切片將必須從索引4到索引3進行積極的步驟。這是不可能的,所以返回一個空列表。
當我們有一個負面的步驟,它看起來像這樣:range(5)[4:3:-2]
。現在,由於我們有一個負面的步驟,所以方向相反。因此,我們可以將索引4日開始,到它只是定義了一個積極的步驟,stop >= start
需要爲真較低的指數3
,併爲負步逆,stop <= start
。
帶有三個參數的切片根據[start:stop:step]
定義。巧合的是,這也是如何用三個參數定義範圍對象的。我們會盡快看到這一點。
你在做什麼,這是:
>>> range(5)
[0, 1, 2, 3, 4]
>>> range(5)[4:-2:-2]
[4]
在Python負指數從序列的長度環繞。所以你的名單長度是5,然後你用-2降低兩級,所以你得到索引3作爲你的止損價值。換句話說,索引3是迭代器的標記值,在該點處,切片操作將停止收集元素。您將逐步降低2個索引,但索引3是標記,因此切片在索引4處抓取元素並停止索引後停止收集元素。
你可能真正想要做的是這樣的:
>>> range(4, -2, -2)
[4, 2, 0]
在Python 2中,'range()'已經返回一個'list'。 – TigerhawkT3
然後我怎麼去負數 – The6thSense
@ VigneshKalai有沒有在該範圍內的負數。如果你想要負數,你不應該告訴範圍從零到某個(正數)。 – poke
正如@Shashank所說,通過將適當的參數傳遞給'range()'來創建'list',而不是試圖將一個不適當的'list'切片成形。 – TigerhawkT3