map() ne transforme rien. Il promet de transformer, un élément à la fois.map() transforms nothing. It promises to transform, one element at a time.
Les numéros précédents ont montré la paresse à travers l'itérateur écrit à la main et le générateur avec yield. Ce dernier numéro du volume referme la boucle en montrant que map(), zip() et filter() — trois fonctions natives que tout le monde utilise depuis toujours — obéissent exactement au même protocole. map(str.upper, noms) ne convertit aucune chaîne : elle retourne un objet map, un itérateur qui n'a encore rien fait. La conversion n'a lieu qu'élément par élément, au fil du for — jamais avant, jamais toute d'un coup.The previous issues showed laziness through the hand-written iterator and the yield-based generator. This volume's closing issue rounds the loop by showing that map(), zip() and filter() — three built-in functions everyone has always used — obey exactly the same protocol. map(str.upper, noms) converts no string: it returns a map object, an iterator that has done nothing yet. The conversion only happens element by element, as the for loop runs — never before, never all at once.
noms = ["ana", "bo", "cyril"] maj = map(str.upper, noms) # AUCUN nom n'est encore mis en majuscules print(type(maj)) # <class 'map'> — pas une liste print(maj) # <map object at 0x...> — rien à afficher, c'est une vue for m in maj: # SEULEMENT MAINTENANT str.upper() tourne, un par un print(m) # 'ANA', 'BO', 'CYRIL'
Face à map(), zip() ou filter(), ne demande jamais « qu'est-ce qu'il contient ? » mais « combien de fois vais-je le parcourir ? » Une fois : laisse-le tel quel. Plus d'une fois : matérialise-le.Facing map(), zip() or filter(), never ask "what does it hold?" but "how many times will I walk it?" Once: leave it as is. More than once: materialize it.
map, zip et filter ne sont pas des cas particuliers à retenir séparément : ce sont trois façades sur le même protocole itérateur du №10 — __iter__ qui retourne self, __next__ qui avance, StopIteration à la fin.map, zip and filter aren't special cases to memorize separately: they're three façades over №10's same iterator protocol — __iter__ returning self, __next__ advancing, StopIteration at the end.