Site original : Sam & Max: Python, Django, Git et du cul
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).