web-dev-qa-db-fra.com

Que fait la fonction slice () en Python?

Tout d'abord, je voudrais clarifier la question: il s'agit de la fonction slice() , pas des tranches de listes ou de chaînes comme a[5:4:3].

Les documents mentionnent que cette fonction est utilisée dans NumPy et ne donnent aucun exemple d'utilisation (il est dit comment l'utiliser mais ce n'est pas dit quand l'utiliser ). De plus, je n'ai jamais vu cette fonction utilisée dans aucun programme Python.

Quand faut-il utiliser la fonction slice() lors de la programmation en clair Python (sans NumPy ou SciPy)? Tous les exemples seront appréciés.

24
ForceBru

a[x:y:z] Donne le même résultat que a[slice(x, y, z)]. L'un des avantages d'un objet slice est qu'il peut être stocké et récupéré ultérieurement en tant qu'objet unique au lieu de stocker x, y et z.

Il est souvent utilisé pour permettre à l'utilisateur de définir sa propre tranche qui peut ensuite être appliquée aux données, sans avoir à traiter de nombreux cas différents.

27
enrico.bacis

Non, ce n'est pas tout!

Comme les objets sont déjà mentionnés, vous devez d'abord savoir que slice est une classe, pas une fonction renvoyant un objet.

La deuxième utilisation de l'instance slice () consiste à passer des arguments aux méthodes getitem () et getslice () lorsque vous créez votre propre objet qui se comporte comme une chaîne, listez et d'autres objets supportant le découpage.

Quand vous faites:

print "blahblah"[3:5]

Cela se traduit automatiquement par:

print "blahblah".__getitem__(slice(3, 5, None))

Ainsi, lorsque vous programmez votre propre objet d'indexation et de découpage:

class example:
    def __getitem__ (self, item):
        if isinstance(item, slice):
            print "You are slicing me!"
            print "From", item.start, "to", item.stop, "with step", item.step
            return self
        if isinstance(item, Tuple):
            print "You are multi-slicing me!"
            for x, y in enumerate(item):
                print "Slice #", x
                self[y]
            return self
        print "You are indexing me!\nIndex:", repr(item)
        return self

Essayez-le:

>>> example()[9:20]
>>> example()[2:3,9:19:2]
>>> example()[50]
>>> example()["String index i.e. the key!"]
>>> # You may wish to create an object that can be sliced with strings:
>>> example()["start of slice":"end of slice"]

Les anciennes versions Python prenaient en charge la méthode getslice () qui serait utilisée à la place de getitem (). Il est recommandé de s'enregistrer. la getitem () si nous avons obtenu une tranche, et si c'est le cas, la rediriger vers la méthode getslice (). De cette façon, vous aurez une compatibilité descendante complète.

C'est ainsi que numpy utilise l'objet slice () pour les manipulations matricielles, et il est évident qu'il est constamment utilisé partout indirectement.

5
Dalen

(Utilisation de la sémantique des fonctions) L'appel de la classe slice instancie un objet slice (start, stop, step), que vous pouvez utiliser comme spécificateur de tranche plus tard dans votre programme:

>>> myname='Rufus'
>>> myname[::-1] # reversing idiom
'sufuR'

>>> reversing_slice=slice(None,None,-1) # reversing idiom as slice object
>>> myname[reversing_slice]
'sufuR'

>>> odds=slice(0,None,2) # another example
>>> myname[odds]
'Rfs'

Si vous aviez une tranche que vous utilisiez souvent, cela est préférable à l'utilisation de constantes dans plusieurs zones de programme, et économisez la peine de conserver 2 ou 3 références qui devaient être saisies à chaque fois.

Bien sûr, cela ressemble à un index, mais après avoir utilisé Python un certain temps, vous apprenez que tout n'est pas à quoi il ressemble à première vue, donc je recommande de nommer mieux vos variables ( comme je l'ai fait avec reversing_slice, contre odds ce qui n'est pas si clair.

4
RufusVS

D'après votre question, je pense que vous cherchez un exemple. Voici donc ce que j'ai quand j'essaie de slice une liste de range(1, 20) avec un pas de

>>> x = range(1, 20)

>>> x[1:20:3]
[2, 5, 8, 11, 14, 17]

>>> x[slice(1, 20, 3)]
[2, 5, 8, 11, 14, 17]
2
kiran.koduru