Il y a quelques jours, dans l’article vous montrant comment inverser une chaine de caractères en Python, j’ai utilisé le slicing. C’est un outil indispensable en Python qui permet de découper une séquence (liste, chaine de caractères ou tuple).

Le slicing a une syntaxe particulière et surtout un comportement déroutant : la borne supérieure est exclue. Je vais dans cet article vous expliquer pourquoi Guido Van Rossum a choisi ce comportement et vous illustrer ceci par un exemple.

Les bases du slicing

Pour l’illustration, je vais utiliser une liste de chaines de caractères. Gardons l’esprit Monthy Python Sacré Graal :

Le slicing nous permet donc d’extraire une tranche de cette liste. La syntaxe utilise les crochets où les bornes inférieure et supérieure sont séparées par deux points :

Vous voyez que cette tranche part bien de l’élément à l’indice inférieur mais que l’élément à l’indice supérieur (ici 4 soit Bedivere) est exclu. Le slicing en Python est donc un ensemble semi-ouvert à droite. J’explique pourquoi Guido Van Rossum a choisi ce comportement dans la partie suivante.

Auparavant, précisons que si vous souhaitez créer une tranche qui commence au début de la séquence ou qui finit à la fin, vous pouvez omettre cette borne. Vous pouvez également utiliser les indices négatifs. Les instructions suivantes signifient respectivement les deux premiers éléments et les deux derniers éléments.

Enfin, vous pouvez ajouter un troisième paramètre qui est le pas. Ainsi, l’instruction suivante retourne une liste de tous les éléments impaires :

Et ce qui est intéressant, c’est qu’avec un pas négatif, on inverse la séquence.

Il est intéressant de voir que si les bornes dépassent la taille de la séquence, le slicing retourne une séquence vide. Ceci va être utile.

Pourquoi un ensemble semi-ouvert ?

Guido Van Rossum a choisi pour le slicing une notation donnant des ensembles semi-ouverts. Ce choix peut paraître déroutant, mais il est très pratique pour ce à quoi servent les slices : faire des tranches. Allons-y en prenant nos chevaliers de Camelot et faisons des groupes de 2. Peu importe la taille du groupe, ce nombre d’éléments sera dans une variable. Nous aurons donc le premier groupe retourné de la manière suivante :

Vous voyez que pour la première passe, la taille souhaitée est l’indice de fin. Et le début du groupe suivant ? Et bien puisque l’ensemble est semi-ouvert à droite, l’indice de début du groupe suivant est simplement l’indice de fin de son précédent soit

Qui nous permet ici d’avoir le reste du groupe.

Et pour avoir des groupes de deux, il suffit d’itérer tant que le slicing produit une liste avec des éléments. En utilisant la propriété que en Python, une liste vide a un sens de faux, le code est :

Bonus Python 3.8 : le Walrus Operator

Le Walrus Operator noté := permet d’assigner une valeur à une variable au sein d’une expression. Ceci permet d’économiser un appel à une instruction dans les cas où on testerait cette instruction et si la condition est bonne, on rappelle cette instruction pour son résultat. L’instruction précédente devient alors :

Voilà, le slicing n’a plus de secret pour vous !

Si vous avez aimé ce post, n’hésitez pas à laisser un commentaire ci-dessous ou sur la page Facebook 😉

À propos de... Darko Stankovski

iT guy, photographe et papa 3.0, je vous fais partager mon expérience et découvertes dans ces domaines. Vous pouvez me suivre sur les liens ci-dessous.