Oulàlà… Il y a quelques jours, en regardant les stats pour Dad 3.0, je vois qu’une recherche qui a conduit ici était « fonction miroir python ». Je sais que cette recherche a conduit à l’article concernant le Mir:ror, article qui date mais dont le code est encore intéressant.

J’ai tout de même fait ma recherche sur Google et j’ai pu voir que ce qui était recherché était l’inversion de chaine de caractères. C’est à dire que d’une chaine « abc », on souhaite obtenir « cba ». Ok. Mais les articles qui ressortent en tête sont juste une catastrophe oO

Alors allons-y pour la manière la plus propre en Python.

Rappel sur les chaines de caractères et idiomes en Python

Il est indispensable de rappeler qu’en Python, les chaines sont immuables. Cela signifie qu’il est impossible de les modifier, c’est à dire de remplacer un caractère, en ajouter ou en supprimer. Il n’y a donc pas de méthode reverse() comme pour les listes. En effet, pour les listes, reverse() ne retourne rien car elle modifie la liste originale, la donnée originale.

Si la même méthode était proposée pour des chaines de caractères, elle devrait avoir le même comportement : ne rien retourner et modifier la donnée originale. Or c’est impossible…

La fonction reversed()

Petit rappel, il existe en Python une fonction built-in qui s’appelle reversed(seq). Celle-ci prend en paramètre une séquence (donc peut prendre une chaine de caractères) et retourne un itérateur sur l’inverse de la séquence.

Nous pouvons donc l’utiliser avec la méthode join() pour créer la chaine de sortie.

Et voilà le résultat.

Et le slicing ?

Si vous ne connaissez pas le slicing qui s’applique à toutes les séquences, je vous invite à consulter la documentation ou au moins mon article dédié. Le troisième paramètre permet de spécifier un pas qui peut être négatif. Ainsi, vous pouvez simplifier l’inversion d’une chaine de caractères de la manière suivante :

Là, plus simple, je n’ai pas…

La chose à ne pas faire !

La chose à ne pas faire, c’est d’écrire le code suivant :

Ce type de code traine en tête des résultats Google pour la requête « inverser chaine Pyhton ». Et il est mauvais pour plusieurs raisons.

La première est une question de ressources. N’oubliez pas qu’en Python, les variables sont des références vers les données. À chaque itération, une nouvelle chaine de caractères est créée par concaténation du caractère et de la séquence précédente. De plus, la variable rseq change de référence à chaque itération.

La seconde grosse raison est une question de lisibilité. Il faut 4 lignes pour comprendre l’intention de ce code. La lisibilité compte, pensez à celui qui lira le code.

La troisième mérite sa propre partie.

Et la question de la performance

Voyons donc la question de la performance pour ces trois types d’instructions :

De manière indéniable, c’est le slicing qui se démarque.

Le code ne doit plus avoir de secret pour vous ! (source inconnue)

La prochaine fois que vous devrez inverser une chaine en Python, dites vous que vous n’avez même pas besoin de fonction.

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.