2009-04-15 3 views
13

Ich verstehe nicht, den folgenden Teil der Python-Dokumentation:"Slicing" in Python-Ausdrücke Dokumentation

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

Ist dies unter Bezugnahme auf die Liste Slicing (x=[1,2,3,4]; x[0:2]) ..? Insbesondere bezieht sich die Teile auf Auslassungs ..

slice_item  ::= expression | proper_slice | ellipsis 

Die Umwandlung einer Scheibe Element, das ein Ausdruck ist, dass die Expression ist. Die Umwandlung eines Ellipsenscheibenelements ist das integrierte Ellipsenobjekt.

Antwort

13

Definition einfacher Test-Klasse, die gerade druckt, was übergeben wird:

>>> class TestGetitem(object): 
... def __getitem__(self, item): 
...  print type(item), item 
... 
>>> t = TestGetitem() 

Expression Beispiel:

>>> 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> 

Scheibe Beispiel:

>>> t[1:2] 
<type 'slice'> slice(1, 2, None) 
>>> t[1:'this':t] 
<type 'slice'> slice(1, 'this', <__main__.TestGetitem object at 0xb7e9bc4c>) 

Auslassungspunkte Beispiel:

>>> t[...] 
<type 'ellipsis'> Ellipsis 

Tuple mit Auslassungs und Scheibe:

>>> t[...,1:] 
<type 'tuple'> (Ellipsis, slice(1, None, None)) 
7

Was passiert ist das. http://docs.python.org/reference/datamodel.html#types und http://docs.python.org/library/functions.html#slice Siehe

Scheibe Objekte Scheiben darstellen, werden verwendet, wenn slice Syntax erweitert ist verwendet. Dies ist eine Scheibe, die zwei Doppelpunkte oder mehrere Scheiben oder Ellipsen verwendet, die durch Kommata getrennt sind, z. B. a [i: j: step], a [i: j, k: l] oder a [..., ich: j]. Sie werden auch von der integrierten Slice() - Funktion erstellt.

Spezielle schreibgeschützte Attribute: start ist die untere Grenze; Stop ist der obere gebunden; Schritt ist der Schrittwert; Jeder ist Keine wenn weggelassen. Diese Attribute können einen beliebigen Typ haben.

x=[1,2,3,4] 
x[0:2] 

Die "0: 2" wird in ein Slice Objekt mit Start von 0, Stopp von 2 und einem Schritt des None transformiert.

Dieses Objekt Slice wird __getitem__ Methode der Klassen zur Verfügung gestellt, die Sie definieren.

>>> class MyClass(object): 
    def __getitem__(self, key): 
     print type(key), key 


>>> x=MyClass() 
>>> x[0:2] 
<type 'slice'> slice(0, 2, None) 

Für die Build-in-Liste Klasse, eine spezielle __getslice__ Methode muss jedoch außer Kraft gesetzt werden.

class MyList(list): 
    def __getslice__(self, i, j=None, k=None): 
     # decode various parts of the slice values 

Die Ellipse ist eine spezielle "Ignoriere diese Dimension" -Syntax für mehrdimensionale Slices.

Weitere Informationen finden Sie unter http://docs.python.org/library/itertools.html#itertools.islice.

21

Ellipsis wird hauptsächlich durch die numeric python Erweiterung verwendet, die eine multidementional Array-Typ hinzufügt. Da es mehr als eine Dimension gibt, wird slicing komplexer als nur ein Start- und Stoppindex; Es ist nützlich, in mehreren Dimensionen zu schneiden. Beispiel Bei einer 4x4-Matrix, die linke obere Fläche würde durch die Scheibe definiert werden, „[: 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]]) 

Auslassungspunkte hier verwendet ist ein Platzhalter für den Rest der Array-Dimensionen, um anzuzeigen, keine Angabe . Stellen Sie es sich so vor, dass das vollständige Segment [:] für nicht spezifizierte Dimensionen angegeben wird, also für ein 3d-Array, a[...,0] ist das gleiche wie a[:,:,0] und für 4d, .

Beachten Sie, dass das tatsächliche Ellipsis-Literal (...) außerhalb der Slice-Syntax in python2 nicht verwendet werden kann, obwohl ein integriertes Ellipsis-Objekt vorhanden ist. Dies ist mit "Die Umwandlung eines Ellipsenscheibenelements ist das integrierte Ellipsenobjekt" gemeint. dh. "a[...]" ist effektiv Zucker für "a[Ellipsis]". In python3, ... bezeichnet überall Auslassungspunkte, so können Sie schreiben:

>>> ... 
Ellipsis 

Wenn Sie nicht numpy verwenden, können Sie so ziemlich ignorieren jegliche Erwähnung von Auslassungspunkte. Keiner der eingebauten Typen verwendet es, so dass Sie sich wirklich darum kümmern müssen, dass Listen ein einzelnes Slice-Objekt übergeben werden, das "start", "stop" und "step" Mitglieder enthält. ie:

l[start:stop:step] # proper_slice syntax from the docs you quote. 

entspricht Aufruf:

l.__getitem__(slice(start, stop, step)) 
+1

Die Aussage "Beachten Sie, dass die tatsächliche Ellipsis literal (...) außerhalb der Scheibe-Syntax in python2 nicht verwendbar ist" nicht ganz genau ist. Sie können "..." folgendermaßen verwenden. a [3, ..., 5], vorausgesetzt, dass a eine Klasseninstanz ist, die __getitem __ (self, key) definiert. Die korrekte Aussage wäre, dass Ellipsis außerhalb des Index-Lookup-Operators nicht verwendbar ist. – abc

+0

@abc: 'a [3, ..., 5]' ist technisch Slicing-Syntax. – user2357112