Comment itérer des séquences/itérables en inverse en Python

Si vous voulez itérer en sens inverse sur un objet séquence (liste, chaîne de carcatères, tuple …), vous pouvez utiliser la fonction intégrée reversed() . Par exemple:

>>> a = [1, 2, 3, 4]
>>> for x in reversed(a):
...     print(x)
...
4
3
2
1

L’itération inversée ne fonctionne que si l’objet en question a une taille qui peut être déterminée ou si l’objet implémente une méthode spéciale __reversed__(). Si ni l’un ni l’autre ne peut être satisfait, vous devrez d’abord convertir l’objet en une liste. Par exemple:

#  Imprime un fichier à l'envers
f = open('fichier')
for line in reversed(list(f)):
    print(line, end='')

Sachez que la transformation d’un itérable en une liste telle qu’illustrée peut consommer beaucoup de mémoire si elle est volumineuse.

Beaucoup de programmeurs ne réalisent pas que l’itération inversée peut être personnalisée sur des classes définies par l’utilisateur s’ils implémentent la méthode __reversed__(). Par exemple:

class Compteur:
    def __init__(self, debut):
        self.debut = debut

    # Itérateur
    def __iter__(self):
        n = self.debut
        while n > 0:
            yield n
            n -= 1

    # Itérateur à l'envers
    def __reversed__(self):
        n = 1
        while n <= self.debut:
            yield n
            n += 1

 

La définition d’un itérateur inversé rend le code beaucoup plus efficace, car il n’est plus nécessaire d’insérer les données dans une liste et de répéter l’itération à l’envers sur la liste.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here