我不理解Python文档的以下部分:
http://docs.python.org/reference/expressions.html#slicings
这是指列表切片(x=[1,2,3,4]; x[0:2]
)..?特别是涉及省略号的部分。
slice_item ::= expression | proper_slice | ellipsis
作为表达式的切片项的转换是该表达式。省略号切片项的转换是内置的省略号对象。
答案 0 :(得分:21)
Ellipsis主要由numeric python扩展名使用,后者添加了多维数组类型。由于存在多个维度,slicing变得比起始和停止索引更复杂;能够切割多个维度也是有用的。例如,给定一个4x4阵列,左上方区域将由切片“[:2,:2]”
定义>>> 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]])
省略号用于指示未指定的其余数组维度的占位符。可以将其视为指示未指定尺寸的完整切片[:],因此
对于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 :(得分:16)
定义只打印正在传递内容的简单测试类:
>>> 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))
答案 2 :(得分:8)
这是怎么回事。请参阅http://docs.python.org/reference/datamodel.html#types和http://docs.python.org/library/functions.html#slice
切片对象用于表示 扩展切片语法时的切片 用过的。这是一个使用两个切片 冒号,或多个切片或椭圆 以逗号分隔,例如, a [i:j:step],a [i:j,k:l],或者[..., I:J]。他们也是由他们创造的 内置的slice()函数。
特殊的只读属性:start是 下限;上层是止损 界; step是步长值;每个都是 没有,如果省略。这些属性可以 有任何类型。
x=[1,2,3,4]
x[0:2]
“0:2”转换为Slice
对象,开头为0,停止为2,步长为无。
此Slice
对象提供给您定义的x
__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以获取更多信息。