L’année dernière, j’ai obtenu ma certification JavaScript de niveau intermédiaire et, en parallèle, j’ai travaillé sur un projet en Python.
À un moment donné, j’ai eu besoin de filtrer une liste et je me suis rendu compte que je ne maîtrisais pas aussi bien la gestion des listes en Python qu’en JavaScript.
Voici donc le premier volet d’une série d’articles consacrés aux méthodes de gestion des listes en Python, en commençant par la fonction map().
La fonction map() en Python
La fonction map() en Python applique une fonction donnée, ou lambda, à chaque élément d’un itérable (par exemple, une liste) et renvoie un objet map (itérateur).
La syntaxe est la suivante : map(function, iterable)
Exemple avec des types primitifs
Commençons par un exemple simple avec un tableau de types primitifs :
|
|
Exemple d’objets
Avec les objets, la logique n’est pas beaucoup plus complexe :
|
|
À propos des performances
Notez qu’en Python, il est souvent nécessaire de convertir l’objet map en liste (ou en un autre type de séquence) pour consulter les résultats immédiatement.
Si vous n’avez pas besoin de tous les résultats en une seule fois, vous pouvez parcourir directement l’itérateur retourné par map, ce qui s’avère plus économe en mémoire pour les grands jeux de données.
Démonstration par un exemple
Lorsque vous utilisez map() en Python, la fonction renvoie un itérateur, et non une liste. Il s’agit là d’une différence majeure par rapport à la fonction map() de JavaScript, qui renvoie immédiatement un nouveau tableau.
|
|
Dans cet exemple, une seule valeur au carré est présente en mémoire à un moment donné, et non pas l’ensemble du million de valeurs.
Ce qui suit finirait par solliciter fortement la mémoire, car on chargerait le million de valeurs en mémoire :
|
|
Exemples d’utilisation concrète
|
|
Considérations importantes
Vous devez comprendre quelques aspects importants de la fonction map() :
-
Les objets
mapsont des itérateurs à usage unique. C’est normal. C’est le comportement attendu en Python :map()renvoie un itérateur paresseux (« lazy » en anglais) qui est traversé après un seul parcours complet. La deuxième boucle ne produit aucune sortie, sans toutefois renvoyer de message d’erreur.1 2 3 4 5 6 7 8 9numbers = [1, 2, 3, 4, 5] squared_map = map(lambda x: x**2, numbers) for num in squared_map: print(num) # Affiche 1, 4, 9, 16, 25 # L'itérateur est désormais traversé for num in squared_map: print(num) # Rien ne s'affiche -
Vous pouvez combiner
mapavec d’autres itérateurs pour un traitement efficace des données :1 2 3 4 5 6 7 8from itertools import islice numbers = range(10000000) # Très grande plage de chiffres squared_map = map(lambda x: x**2, numbers) # Récupérer uniquement les 5 premiers résultats sans traiter tous les éléments first_five = list(islice(squared_map, 5)) print(first_five) # Résultat : [0, 1, 4, 9, 16]Cette approche d’évaluation paresseuse est particulièrement utile lorsque l’on travaille avec des ensembles de données trop volumineux pour tenir en mémoire, car elle permet de traiter les données en continu.
Références de documentation
Vous souhaitez aller plus loin ? Voici quelques articles de documentation à conserver comme référence (ils sont en anglais) :
- https://www.w3schools.com/python/ref_func_map.asp
- https://www.digitalocean.com/community/tutorials/python-map-function
- https://docs.python.org/3/library/functions.html
- https://www.freecodecamp.org/news/python-map-explained-with-examples/
Suivez-moi !
Merci d’avoir lu cet article. Assurez-vous de me suivre sur X, de vous abonner à ma publication Substack et d’ajouter mon blog à vos favoris pour ne pas manquer les prochains articles.
Crédit: Photo de Pixabay sur Pexels.