我不明白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