2009-04-15 35 views

回答

13

定義簡單的測試類,它只是打印什麼是傳遞:

>>> class TestGetitem(object): 
... def __getitem__(self, item): 
...  print type(item), item 
... 
>>> t = TestGetitem() 

表達例如:

>>> t[1] 
<type 'int'> 1 
>>> t[3-2] 
<type 'int'> 1 
>>> t['test'] 
<type 'str'> test 
>>> t[t] 
<class '__main__.TestGetitem'> <__main__.TestGetitem object at 0xb7e9bc4c> 

切片例如:

>>> t[1:2] 
<type 'slice'> slice(1, 2, None) 
>>> t[1:'this':t] 
<type 'slice'> slice(1, 'this', <__main__.TestGetitem object at 0xb7e9bc4c>) 

省略號例如:

>>> t[...] 
<type 'ellipsis'> Ellipsis 

元組省略號和切片:

>>> t[...,1:] 
<type 'tuple'> (Ellipsis, slice(1, None, None)) 
7

這是什麼情況。見http://docs.python.org/reference/datamodel.html#typeshttp://docs.python.org/library/functions.html#slice

切片對象是用來代表 切片擴展切片語法當使用 。這是使用兩個 冒號,或用逗號分隔的多個切片或橢圓 ,例如, a [i:j:step],a [i:j,k:l]或[..., I:J]。它們也是由 內置的slice()函數創建的。

特殊只讀屬性:開始是 的下限;停止是上限 界限;步驟是步驟值;每個都是 沒有,如果省略。這些屬性可以有 有任何類型。

x=[1,2,3,4] 
x[0:2] 

的 「0:2」 被變換成具有0開始,第2光闌和無的步驟的Slice對象。

This Slice object is provided to x's __getitem__您定義的類的方法。

>>> class MyClass(object): 
    def __getitem__(self, key): 
     print type(key), key 


>>> x=MyClass() 
>>> x[0:2] 
<type 'slice'> slice(0, 2, None) 

對於內置的列表類,但是,一個特殊__getslice__方法必須重寫。

class MyList(list): 
    def __getslice__(self, i, j=None, k=None): 
     # decode various parts of the slice values 

省略號是一種特殊的「忽略此維度」語法提供給多維切片。更多信息請參閱http://docs.python.org/library/itertools.html#itertools.islice

21

Ellipsis主要用於由numeric python擴展,這增加了一個multidementional陣列型。由於存在多個維度,所以slicing變得比起始和停止索引更復雜;能夠在多個維度上切片也是有用的。

>>> a 
array([[ 1, 2, 3, 4], 
     [ 5, 6, 7, 8], 
     [ 9, 10, 11, 12], 
     [13, 14, 15, 16]]) 

>>> a[:2,:2] # top left 
array([[1, 2], 
     [5, 6]]) 

省略號此處用於指示數組維度的其餘部分的佔位符未指定「[2:2,]」,例如,給定4×4陣列,左上區域將被由切片定義。將其視爲指示未指定尺寸的全切片[:],因此對於3d陣列, ,a[...,0]a[:,:,0]和4d,a[:,:,:,0]相同。

請注意,實際的省略號文字(...)在python2的片語法之外是不可用的,儘管有一個內置的省略號對象。這就是「省略號切片項目的轉換是內建的省略號對象」的含義。即。 「a[...]」實際上是「a[Ellipsis]」的糖。在python3,...表示省略任何地方,所以你可以寫:

>>> ... 
Ellipsis 

如果你不使用numpy的,你幾乎可以忽略省略的都不在話下。內置類型都沒有使用它,所以你真正關心的是列表通過一個單片對象,其中包含「start」,「stop」和「step」成員。即:

l[start:stop:step] # proper_slice syntax from the docs you quote. 

等效於調用:

l.__getitem__(slice(start, stop, step)) 
+1

聲明「注意實際的字面省略號(...)是不是在python2切片語法之外使用」並不完全準確。您可以通過以下方式使用「...」。 a [3,...,5],因爲a是定義__getitem __(self,key)的類實例。正確的說法是,省略號在索引查找操作符之外是不可用的。 – abc 2013-02-03 21:21:15