Python表达式文档中的“切片”

时间:2009-04-15 16:39:43

标签: python syntax

我不理解Python文档的以下部分:

http://docs.python.org/reference/expressions.html#slicings

这是指列表切片(x=[1,2,3,4]; x[0:2])..?特别是涉及省略号的部分。

slice_item       ::=  expression | proper_slice | ellipsis
  

作为表达式的切片项的转换是该表达式。省略号切片项的转换是内置的省略号对象。

3 个答案:

答案 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#typeshttp://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以获取更多信息。