2015-05-28 78 views
7

不確定在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],不知道該如何工作。

回答

8

在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]

+0

然後我怎麼去負數 – The6thSense

+0

@ VigneshKalai有沒有在該範圍內的負數。如果你想要負數,你不應該告訴範圍從零到某個(正數)。 – poke

+0

正如@Shashank所說,通過將適當的參數傳遞給'range()'來創建'list',而不是試圖將一個不適當的'list'切片成形。 – TigerhawkT3

-1

[x:y:z]代表[start:stop:jumps]在5範圍內,它將迭代0-4(包括0和4),既然z是負數,它將從4迭代到0有2個跳躍4 --- 3 --- 2(---代表跳躍)所以輸出是 4 ---(3)--- 2 ---(1)--- 0。 ------> ------->

編碼快樂

7

你是對的,這是[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

+0

但'範圍(5)[4:-2]''結果[]'。那麼範圍(5)[4:-2:-2]結果是[4]'? – itzMEonTV

+0

@itzmeontv在我的回答中添加了對此的回覆。 – poke

+0

好吧,這應該是一個更好的解釋這 – itzMEonTV

2

帶有三個參數的切片根據[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] 
+1

在Python 2中,'range()'已經返回一個'list'。 – TigerhawkT3