2016-11-30 32 views
-3

我想上的同名the post接受的答案發表評論,但我的方式太綠。slice()函數在Python中做什麼? (相對於片符號)

答案「a [x:y:z]與[slice(x,y,z)]給出了相同的結果」,在我的嘗試中沒有證明是真實的,所以我正在尋求更深入的理解slice()和切片符號之間的區別。

我有具有消息體這樣的串行協議:Q0134CA24B。

如果我想收集該協議的內容,這將是非常好的做到這一點:

>>> str = 'Q0134CA24B' 
>>> cmd = slice(0,1) 
>>> str[cmd] 
'Q' 
>>> cs = slice(-2,0) 
>>> str[cs] 
'' 
>>> cs 
slice(-2, 0, None) 
>>> str[cs] 
'' 
>>> str[-2:None:None] 
'4B' 

那麼,我究竟做錯了什麼? slice()與slice符號相比是否受限?這對我來說非常有用,因爲我經常使用串行協議並且使用slice()定義字符字段將是傳遞這種表示的Python方法。

+2

我很難理解這個問題。聲明「a [x:y:z]給出了與[slice(x,y,z)]相同的結果」,在我的嘗試中沒有證明是真實的。「 - 我沒有看到你演示的任何嘗試這兩者之間的不一致性... – mgilson

+2

沒有你的測試顯示[X:Y:Z]'之間的差。'和'一個[切片(X,Y,Z)]' – user2357112

+0

哎呀該欺騙具有完全相同的標題太...它幾乎就像你可以谷歌它 –

回答

1

編輯以 「停止」。

兩個符號是一致的,也許你與None混淆00是一個位置,None是沒有那個。引用的源代碼(Objects/sliceobject.c):「開始,停止,和步驟是Python對象與無指示沒有索引存在。」

None0是用於開始位置是相同的。

>>> s = 'Q0134CA24B' 
>>> s[:1] 
'Q' 
>>> s[0:1] 
'Q' 

對於停止,None手段「通過該序列的結尾」,而0裝置的位置。

>>> s = 'Q0134CA24B' 
>>> s[1:] 
'0134CA24B' 
>>> s[1:0] 
'' 

>>> s[::-1] # Simple 'reverse' trick 
'B42AC4310Q' 
>>> s[:None:-1] 
'B42AC4310Q' 
>>> s[:0:-1] 
'B42AC4310'  

對於步驟,None手段之一,但0無效,將引發ValueError,並且如果你正在使用[ ]符號或slice()是一樣的。

以你的例子(str是一個不好的名字爲變量):

>>> s = 'Q0134CA24B' 
>>> cmd = slice(0,1) 
>>> s[cmd] 
'Q' 
>>> s[0:1] 
'Q' 

>>> cs = slice(-2,0) 
>>> s[cs] 
'' 
>>> s[-2:0] 
'' 
>>> cs 
slice(-2, 0, None) 

>>> s[-2:None:None] 
'4B' 
>>> s[-2::] 
'4B' 
>>> cd = slice(-2,None,None) 
>>> str[cd] 
'4B' 

沒有矛盾存在。

+0

非常感謝我在第一線誤解的根源,併爲一種解釋。 。但是我覺得這個錯誤真的很愚蠢。 – kc64

+1

「對於長度...」 - 不,沒有長度參數,你得到停止和長度混合。爲0意味着您選擇的子序列結束於原始序列的索引0(不包括),而不是您選擇長度爲0的子序列。 – user2357112

+0

@ user2357112:oops - 您是正確的 - 編輯 – cdarke