2009-04-15 3 views
13

Je ne comprends pas la partie suivante de la documentation Python:"Slicing" dans la documentation des expressions Python

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

Est-ce faisant référence à trancher la liste (x=[1,2,3,4]; x[0:2]) ..? En particulier, les parties se référant à des points de suspension ..

slice_item  ::= expression | proper_slice | ellipsis 

La conversion d'un élément de tranche qui est une expression est cette expression. La conversion d'un élément de tranche d'ellipse est l'objet Ellipsis intégré.

Répondre

13

Définition de la classe de test simple qui vient d'imprimer ce qui est passé:

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

Exemple d'expression:

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

exemple Tranche:

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

Ellipsis exemple:

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

tuple avec des points de suspension et de tranche:

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

Qu'est-ce qui se passe est-ce. Voir http://docs.python.org/reference/datamodel.html#types et http://docs.python.org/library/functions.html#slice

objets Slice sont utilisés pour représenter tranches lorsque la syntaxe étendue de tranche est utilisée. Ceci est une tranche utilisant deux deux points, ou plusieurs tranches ou ellipses séparés par des virgules, par exemple, un [i: j: pas], un [i: j, k: l], ou un [..., i: j]. Ils sont également créés par la fonction intégrée slice() .

Attributs spéciaux en lecture seule: start est la borne inférieure; l'arrêt est la limite supérieure ; l'étape est la valeur de l'étape; chacun est Aucun si omis. Ces attributs peuvent avoir n'importe quel type.

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

Le "0: 2" est transformé en un objet Slice avec départ de 0, arrêt de 2 et une étape de Néant.

Cet objet Slice est fourni à x méthode __getitem__ des classes que vous définissez.

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


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

Pour la classe de liste build-in, cependant, une méthode __getslice__ spéciale doit être remplacée. L'ellipse est une syntaxe spéciale «ignore this dimension» fournie aux tranches multidimensionnelles. Pour plus d'informations, consultez également http://docs.python.org/library/itertools.html#itertools.islice.

21

Ellipsis est utilisé principalement par l'extension numeric python, ce qui ajoute un type de réseau multidementional. Comme il y a plus d'une dimension, slicing devient plus complexe qu'un simple index de départ et d'arrêt; il est utile de pouvoir découper en plusieurs dimensions. par exemple, étant donné un tableau de 4x4, la zone en haut à gauche serait défini par la tranche « [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]]) 

Ellipsis est utilisé ici pour indiquer un espace réservé pour le reste des dimensions du tableau non spécifié . Pensez-y comme indiquant la tranche complète [:] pour les dimensions non spécifiées, donc pour un tableau 3d, a[...,0] est le même que a[:,:,0] et pour 4d, a[:,:,:,0].

Notez que le littéral Ellipsis réel (...) n'est pas utilisable en dehors de la syntaxe de tranche dans python2, bien qu'il existe un objet Ellipsis intégré. C'est ce que l'on entend par "La conversion d'un élément de tranche de ellipse est l'objet Ellipsis intégré." c'est à dire. "a[...]" est effectivement du sucre pour "a[Ellipsis]". Dans python3, ... indique Ellipsis partout, donc vous pouvez écrire:

>>> ... 
Ellipsis 

Si vous ne l'utilisez numpy, vous pouvez très bien ignorer toute mention de Ellipsis. Aucun des types intégrés ne l'utilise, donc tout ce dont vous avez à vous soucier c'est que les listes reçoivent un seul objet, qui contient les membres "start", "stop" et "step". à savoir:

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

équivaut à appeler:

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

La déclaration « Notez que le Ellipsis réelle littérale (...) ne sont pas utilisables en dehors de la syntaxe de tranche dans python2 » n'est pas tout à fait exact. Vous pouvez utiliser "..." de la manière suivante. a [3, ..., 5], étant donné que a est une instance de classe qui définit __getitem __ (self, key). La déclaration correcte serait Ellipsis n'est pas utilisable en dehors de l'opérateur de recherche d'index. – abc

+0

@abc: 'a [3, ..., 5]' est une syntaxe de découpage technique. – user2357112

Questions connexes