2009-04-15 52 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