Une boucle while de moins


Si vous devez retenir un truc de la partie Python de ce blog, c’est qu’en Python, l’itération est tout.

Du coup, on utilise pas beaucoup while, à part dans quelques cas particuliers.

Le cas d’école, c’est la lecture d’un fichier octet par octet.

Imaginez, vous créez un petit array de float écrits en 64 bits :

>>> import numpy as np
>>> a = np.sin(np.linspace(2.0, 3.0, num=100))
>>> a.dtype
dtype('float64')

Vous sauvegardez tout ça dans un fichier :

>>> a.tofile('/tmp/data')

Si vous voulez lire le fichier hors de numpy, il faut le charger float par float, donc le lire 64 bits par 64 bits soit par groupes de 8 octets.

La méthode canonique :

with open('/tmp/data', 'rb') as f:
    while True:
        nombre = f.read(8)
        if not nombre:
            break
        # faire un truc avec le nombre

Mais il existe une autre manière de faire cela, moins connue : utiliser iter().

with open('/tmp/data', 'rb') as f:
    for nombre in iter(lambda: f.read(8), b''):
        # faire un truc avec nombre

Cela marche car iter(), parmi ses nombreuses fonctionnalités, accepte un callable en paramètre (ici notre lambda), et va l’appeler jusqu’à ce que celui-ci retourne une valeur dite “sentinelle” (ici notre second paramètre).

5 thoughts on “Une boucle while de moins

  • Symen

    Plutôt cool !

    J’ai toujours l’impression de faire quelque chose de moche quand j’en reviens à faire une boucle comme celle-ci, du coup je me ferai un plaisir d’utiliser iter à la place. :)

  • zzz

    Pas plutôt import numpy as np dans le premier exemple ? ;-)

    Cool, l’astuce, c’est vrai qu’on connaît pas très bien iter()

  • Sam Post author

    Ah, mé arrêté de voir toutes mé fotes, je me san tou nu.

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.