我不明白Python文檔的以下部分:「切片」 Python表達式文檔
http://docs.python.org/reference/expressions.html#slicings
這是指列表切片(x=[1,2,3,4]; x[0:2]
)..?特別是零件參照省略號..
slice_item ::= expression | proper_slice | ellipsis
那是一個表達式是表達一個切片項的轉化。省略號切片項目的轉換是內置的省略號對象。
我不明白Python文檔的以下部分:「切片」 Python表達式文檔
http://docs.python.org/reference/expressions.html#slicings
這是指列表切片(x=[1,2,3,4]; x[0:2]
)..?特別是零件參照省略號..
slice_item ::= expression | proper_slice | ellipsis
那是一個表達式是表達一個切片項的轉化。省略號切片項目的轉換是內置的省略號對象。
定義簡單的測試類,它只是打印什麼是傳遞:
>>> 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))
這是什麼情況。見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。
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))
聲明「注意實際的字面省略號(...)是不是在python2切片語法之外使用」並不完全準確。您可以通過以下方式使用「...」。 a [3,...,5],因爲a是定義__getitem __(self,key)的類實例。正確的說法是,省略號在索引查找操作符之外是不可用的。 – abc 2013-02-03 21:21:15