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).
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. :)
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()
En effet, c’est un alias pas un import from.
C’est pas plutôt
a.dtype
au lieu dea.dtypes
?Ah, mé arrêté de voir toutes mé fotes, je me san tou nu.